Ignore:
Timestamp:
06/01/22 05:01:48 (3 years ago)
Author:
Mathieu Morlighem
Message:

merged trunk-jpl and trunk for revision 27033

Location:
issm/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk

  • issm/trunk/src

  • issm/trunk/src/c/classes/SealevelGeometry.cpp

    r26744 r27035  
    3535                nsubel[i]=0;
    3636                nbar[i]=0;
     37                Ylm_subel[i]= xNewZeroInit<IssmDouble>(localnel*9);
    3738        }
    3839        late=xNew<IssmDouble>(localnel);
     
    4041        isoceanin=xNew<bool>(localnel);
    4142        lids=xNew<int>(localnodsin);
     43        Ylm=xNewZeroInit<IssmDouble>(localnel*9); // (degmax+1)^2 terms, degmax=2
    4244
    4345}; /*}}}*/
     
    5658                xDelete<IssmDouble>(longbarycentre[i]);
    5759                xDelete<IssmDouble>(area_subel[i]);
    58         }
     60                xDelete<IssmDouble>(Ylm_subel[i]);
     61        }
     62        xDelete<IssmDouble>(Ylm);
    5963        xDelete<IssmDouble>(late);
    6064        xDelete<IssmDouble>(longe);
     
    7175        for (int i=0;i<SLGEOM_NUMLOADS;i++){
    7276                subelementmapping[i]=xNew<int>(localnel);
     77                #ifdef _HAVE_PETSC_
    7378                GetOwnershipBoundariesFromRange(&lower_row,&dummy,nsubel[i],IssmComm::GetComm());
     79                #else
     80                _error_("not supported without PETSc compiled");
     81                #endif
    7482
    7583                int count=0;
     
    155163
    156164} /*}}}*/
     165void 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.