Changeset 27035 for issm/trunk/src/c/classes/SealevelGeometry.cpp
- Timestamp:
- 06/01/22 05:01:48 (3 years ago)
- Location:
- issm/trunk
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk
- Property svn:mergeinfo changed
/issm/trunk-jpl merged: 26745-26955,26957-27031
- Property svn:mergeinfo changed
-
issm/trunk/src
- Property svn:mergeinfo changed
-
issm/trunk/src/c/classes/SealevelGeometry.cpp
r26744 r27035 35 35 nsubel[i]=0; 36 36 nbar[i]=0; 37 Ylm_subel[i]= xNewZeroInit<IssmDouble>(localnel*9); 37 38 } 38 39 late=xNew<IssmDouble>(localnel); … … 40 41 isoceanin=xNew<bool>(localnel); 41 42 lids=xNew<int>(localnodsin); 43 Ylm=xNewZeroInit<IssmDouble>(localnel*9); // (degmax+1)^2 terms, degmax=2 42 44 43 45 }; /*}}}*/ … … 56 58 xDelete<IssmDouble>(longbarycentre[i]); 57 59 xDelete<IssmDouble>(area_subel[i]); 58 } 60 xDelete<IssmDouble>(Ylm_subel[i]); 61 } 62 xDelete<IssmDouble>(Ylm); 59 63 xDelete<IssmDouble>(late); 60 64 xDelete<IssmDouble>(longe); … … 71 75 for (int i=0;i<SLGEOM_NUMLOADS;i++){ 72 76 subelementmapping[i]=xNew<int>(localnel); 77 #ifdef _HAVE_PETSC_ 73 78 GetOwnershipBoundariesFromRange(&lower_row,&dummy,nsubel[i],IssmComm::GetComm()); 79 #else 80 _error_("not supported without PETSc compiled"); 81 #endif 74 82 75 83 int count=0; … … 155 163 156 164 } /*}}}*/ 165 void SealevelGeometry::BuildSphericalHarmonics(){ /*{{{*/ 166 //builds spherical harmonics functions for degrees 0, 1, 2 on centroids/barycenters 167 //0: used for global average 168 //1: used for geocenter motion 169 //2: used for rotational feedback 170 int intj, count; 171 172 IssmDouble YlmNorm[9]; 173 174 //YlmNormalization: N^2=(2*l+1)/4/pi * factorial(l-m)/factorial(l+m) if m==0 175 // : 2*N^2 if m>0 176 // such that integral(Ylm * Ylm *YlmNorm dS) = 1 on the unit sphere. 177 YlmNorm[0]=(0.25/M_PI); //Y00 178 YlmNorm[1]=(0.75/M_PI); //Y10 179 YlmNorm[2]=(0.75/M_PI); //Y11c 180 YlmNorm[3]=YlmNorm[2]; //Y11s 181 YlmNorm[4]=(1.25/M_PI); //Y20 182 YlmNorm[5]=(1.25/3./M_PI); //Y21c 183 YlmNorm[6]=YlmNorm[5]; //Y21s 184 YlmNorm[7]=(1.25/12./M_PI); //Y22c 185 YlmNorm[8]=YlmNorm[7]; //Y22s 186 187 for (int e=0;e<localnel;e++){ 188 IssmDouble lat=late[e]*M_PI/180.; 189 IssmDouble lon=longe[e]*M_PI/180.; 190 Ylm[0*localnel+e] = 1.0 *YlmNorm[0]; //Y00 191 192 Ylm[1*localnel+e] = sin(lat)*YlmNorm[1]; //Y10 193 Ylm[2*localnel+e] = cos(lat)*cos(lon)*YlmNorm[2]; //Y11cos 194 Ylm[3*localnel+e] = cos(lat)*sin(lon)*YlmNorm[3]; //Y11sin 195 196 //Ylm[4*localnel+e] = 0.25 - 0.75*cos(2.0*lat) ; //Y20 197 Ylm[4*localnel+e] = (1.5*pow(sin(lat),2.)-0.5)*YlmNorm[4]; //Y20 198 Ylm[5*localnel+e] = 1.5*sin(2.*lat)*cos(lon)*YlmNorm[5]; //Y21cos 199 Ylm[6*localnel+e] = 1.5*sin(2.*lat)*sin(lon)*YlmNorm[6]; //Y21sin 200 Ylm[7*localnel+e] = 1.5*(1.+cos(2.*lat))*cos(2.*lon)*YlmNorm[7]; //Y22cos 201 Ylm[8*localnel+e] = 1.5*(1.+cos(2.*lat))*sin(2.*lon)*YlmNorm[8]; //Y22sin 202 } 203 204 for (int i=0;i<SLGEOM_NUMLOADS;i++){ 205 for (int e=0;e<localnel;e++){ 206 if (issubelement[i][e]){ 207 intj=subelementmapping[i][e]; 208 IssmDouble lat=latbarycentre[i][intj]*M_PI/180.; 209 IssmDouble lon=longbarycentre[i][intj]*M_PI/180.; 210 Ylm_subel[i][0*localnel+e] = 1.0*YlmNorm[0]; //Y00 211 212 Ylm_subel[i][1*localnel+e] = sin(lat)*YlmNorm[1]; //Y10 213 Ylm_subel[i][2*localnel+e] = cos(lat)*cos(lon)*YlmNorm[2]; //Y11cos 214 Ylm_subel[i][3*localnel+e] = cos(lat)*sin(lon)*YlmNorm[3]; //Y11sin 215 216 Ylm_subel[i][4*localnel+e] = (1.5*pow(sin(lat),2.)-0.5)*YlmNorm[4]; //Y20 217 Ylm_subel[i][5*localnel+e] = 1.5*sin(2.*lat)*cos(lon)*YlmNorm[5]; //Y21cos 218 Ylm_subel[i][6*localnel+e] = 1.5*sin(2.*lat)*sin(lon)*YlmNorm[6]; //Y21sin 219 Ylm_subel[i][7*localnel+e] = 1.5*(1.+cos(2.*lat))*cos(2.*lon)*YlmNorm[7]; //Y22cos 220 Ylm_subel[i][8*localnel+e] = 1.5*(1.+cos(2.*lat))*sin(2.*lon)*YlmNorm[8]; //Y22sin 221 } 222 } 223 } 224 } /*}}}*/
Note:
See TracChangeset
for help on using the changeset viewer.