00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #include <PointsSpectrum.h>
00035 #include <Spectrum.h>
00036 #include <Vector.h>
00037 #include <classTags.h>
00038
00039
00040 PointsSpectrum::PointsSpectrum(int tag, Vector freq, Vector ampl)
00041 :Spectrum(tag,SPECTRUM_points)
00042 {
00043
00044 int numPoints = freq.Size();
00045 if (numPoints != ampl.Size()) {
00046 opserr << "Number of points to PointsSpectrum is not consistent!" << endln;
00047 }
00048
00049
00050 for (int i=1; i<freq.Size(); i++) {
00051 if (freq(i-1)>freq(i)) {
00052 opserr << "ERROR: The given Spectrum frequencies are not consequtive!" << endln;
00053 }
00054 }
00055
00056 frequencies = new Vector(freq);
00057 amplitudes = new Vector(ampl);
00058
00059 }
00060
00061 PointsSpectrum::~PointsSpectrum()
00062 {
00063 if (frequencies != 0)
00064 delete frequencies;
00065 if (amplitudes != 0)
00066 delete frequencies;
00067 }
00068
00069 void
00070 PointsSpectrum::Print(OPS_Stream &s, int flag)
00071 {
00072 }
00073
00074
00075 double
00076 PointsSpectrum::getMinFrequency()
00077 {
00078 return (*frequencies)(0);
00079 }
00080
00081
00082 double
00083 PointsSpectrum::getMaxFrequency()
00084 {
00085 return (*frequencies)(frequencies->Size()-1);
00086 }
00087
00088
00089 double
00090 PointsSpectrum::getAmplitude(double frequency)
00091 {
00092 double result;
00093
00094 if (frequency < (*frequencies)(0) || frequency > (*frequencies)(frequencies->Size()-1) ) {
00095 result = 0.0;
00096 }
00097 else {
00098 double dy, dx, a, b;
00099 for (int i=1; i<frequencies->Size(); i++) {
00100 if (frequency > (*frequencies)(i-1) && frequency < (*frequencies)(i)) {
00101 dy = (*amplitudes)(i) - (*amplitudes)(i-1);
00102 dx = (*frequencies)(i) - (*frequencies)(i-1);
00103 a = dy/dx;
00104 b = (*amplitudes)(i-1);
00105 result = a * (frequency-(*frequencies)(i-1)) + b;
00106 }
00107 }
00108 }
00109
00110 return result;
00111 }