Changeset 20999
- Timestamp:
- 07/26/16 14:42:18 (9 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 16 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/SealevelriseAnalysis.cpp
r20704 r20999 43 43 IssmDouble* love_h=NULL; 44 44 IssmDouble* love_k=NULL; 45 IssmDouble* love_l=NULL; 45 46 46 47 bool elastic=false; 47 48 IssmDouble* G_elastic = NULL; 48 49 IssmDouble* G_elastic_local = NULL; 50 IssmDouble* U_elastic = NULL; 51 IssmDouble* U_elastic_local = NULL; 52 IssmDouble* H_elastic = NULL; 53 IssmDouble* H_elastic_local = NULL; 49 54 int M,m,lower_row,upper_row; 50 55 IssmDouble degacc=.01; … … 72 77 iomodel->FetchData(&love_h,&nl,NULL,"md.slr.love_h"); 73 78 iomodel->FetchData(&love_k,&nl,NULL,"md.slr.love_k"); 79 iomodel->FetchData(&love_l,&nl,NULL,"md.slr.love_l"); 74 80 75 81 /*compute elastic green function for a range of angles*/ … … 77 83 M=reCast<int,IssmDouble>(180./degacc+1.); 78 84 G_elastic=xNew<IssmDouble>(M); 85 U_elastic=xNew<IssmDouble>(M); 86 H_elastic=xNew<IssmDouble>(M); 79 87 80 88 /*compute combined legendre + love number (elastic green function:*/ … … 82 90 GetOwnershipBoundariesFromRange(&lower_row,&upper_row,m,IssmComm::GetComm()); 83 91 G_elastic_local=xNew<IssmDouble>(m); 92 U_elastic_local=xNew<IssmDouble>(m); 93 H_elastic_local=xNew<IssmDouble>(m); 84 94 85 95 for(int i=lower_row;i<upper_row;i++){ … … 88 98 89 99 G_elastic_local[i-lower_row]= (love_k[nl-1]-love_h[nl-1])/2.0/sin(alpha/2.0); 100 U_elastic_local[i-lower_row]= (love_h[nl-1])/2.0/sin(alpha/2.0); 101 H_elastic_local[i-lower_row]= 0; 90 102 IssmDouble Pn,Pn1,Pn2; 103 IssmDouble Pn_p,Pn_p1,Pn_p2; 91 104 for (int n=0;n<nl;n++) { 92 IssmDouble deltalove; 93 94 deltalove = (love_k[n]-love_k[nl-1]-love_h[n]+love_h[nl-1]); 95 96 if(n==0)Pn=1; 97 else if(n==1)Pn=cos(alpha); 98 else Pn= ( (2*n-1)*cos(alpha)*Pn1 - (n-1)*Pn2 ) /n; 105 IssmDouble deltalove_G; 106 IssmDouble deltalove_U; 107 108 deltalove_G = (love_k[n]-love_k[nl-1]-love_h[n]+love_h[nl-1]); 109 deltalove_U = (love_h[n]-love_h[nl-1]); 110 111 /*compute legendre polynomials: P_n(cos\theta) & d P_n(cos\theta)/ d\theta: */ 112 if(n==0){ 113 Pn=1; 114 Pn_p=0; 115 } 116 else if(n==1){ 117 Pn = cos(alpha); 118 Pn_p = 1; 119 } 120 else{ 121 Pn = ( (2*n-1)*cos(alpha)*Pn1 - (n-1)*Pn2 ) /n; 122 Pn_p = ( (2*n-1)*(Pn1+cos(alpha)*Pn_p1) - (n-1)*Pn_p2 ) /n; 123 } 99 124 Pn2=Pn1; Pn1=Pn; 100 101 G_elastic_local[i-lower_row] += deltalove*Pn; 125 Pn_p2=Pn_p1; Pn_p1=Pn_p; 126 127 G_elastic_local[i-lower_row] += deltalove_G*Pn; // gravitational potential 128 U_elastic_local[i-lower_row] += deltalove_U*Pn; // vertical (up) displacement 129 H_elastic_local[i-lower_row] += sin(alpha)*love_l[n]*Pn_p; // horizontal displacements 102 130 } 103 131 } 104 132 105 /*merge G_elastic_local into G_elastic :{{{*/133 /*merge G_elastic_local into G_elastic; U_elastic_local into U_elastic; H_elastic_local to H_elastic:{{{*/ 106 134 int* recvcounts=xNew<int>(IssmComm::GetSize()); 107 135 int* displs=xNew<int>(IssmComm::GetSize()); … … 115 143 /*All gather:*/ 116 144 ISSM_MPI_Allgatherv(G_elastic_local, m, ISSM_MPI_DOUBLE, G_elastic, recvcounts, displs, ISSM_MPI_DOUBLE,IssmComm::GetComm()); 145 ISSM_MPI_Allgatherv(U_elastic_local, m, ISSM_MPI_DOUBLE, U_elastic, recvcounts, displs, ISSM_MPI_DOUBLE,IssmComm::GetComm()); 146 ISSM_MPI_Allgatherv(H_elastic_local, m, ISSM_MPI_DOUBLE, H_elastic, recvcounts, displs, ISSM_MPI_DOUBLE,IssmComm::GetComm()); 117 147 /*free ressources: */ 118 148 xDelete<int>(recvcounts); … … 124 154 G_elastic[0]=G_elastic[1]; 125 155 parameters->AddObject(new DoubleVecParam(SealevelriseGElasticEnum,G_elastic,M)); 156 U_elastic[0]=U_elastic[1]; 157 parameters->AddObject(new DoubleVecParam(SealevelriseUElasticEnum,U_elastic,M)); 158 H_elastic[0]=H_elastic[1]; 159 parameters->AddObject(new DoubleVecParam(SealevelriseHElasticEnum,H_elastic,M)); 126 160 127 161 /*free ressources: */ 128 162 xDelete<IssmDouble>(love_h); 129 163 xDelete<IssmDouble>(love_k); 164 xDelete<IssmDouble>(love_l); 130 165 xDelete<IssmDouble>(G_elastic); 131 166 xDelete<IssmDouble>(G_elastic_local); 167 xDelete<IssmDouble>(U_elastic); 168 xDelete<IssmDouble>(U_elastic_local); 169 xDelete<IssmDouble>(H_elastic); 170 xDelete<IssmDouble>(H_elastic_local); 132 171 } 133 172 -
issm/trunk-jpl/src/c/classes/Elements/Element.cpp
r20965 r20999 1501 1501 name==MaterialsRheologyEsbarEnum || 1502 1502 name==SealevelEnum || 1503 name==SealevelUmotionEnum || 1504 name==SealevelNmotionEnum || 1505 name==SealevelEmotionEnum || 1506 name==SealevelAbsoluteEnum || 1503 1507 name==SealevelEustaticEnum || 1504 1508 name==SealevelriseDeltathicknessEnum || -
issm/trunk-jpl/src/c/classes/Elements/Element.h
r20871 r20999 303 303 virtual void SealevelriseEustatic(Vector<IssmDouble>* pSgi,IssmDouble* peustatic,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea)=0; 304 304 virtual void SealevelriseNonEustatic(Vector<IssmDouble>* pSgo,IssmDouble* Sg_old,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea)=0; 305 virtual void SealevelriseGeodetic(Vector<IssmDouble>* pUp,Vector<IssmDouble>* pNorth,Vector<IssmDouble>* pEast,IssmDouble* Sg,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble* xx,IssmDouble* yy,IssmDouble* zz,IssmDouble oceanarea,IssmDouble eartharea)=0; 305 306 #endif 306 307 -
issm/trunk-jpl/src/c/classes/Elements/Penta.h
r20871 r20999 188 188 void SealevelriseEustatic(Vector<IssmDouble>* pSgi,IssmDouble* peustatic,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea){_error_("not implemented yet!");}; 189 189 void SealevelriseNonEustatic(Vector<IssmDouble>* pSgo,IssmDouble* Sg_old,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea){_error_("not implemented yet!");}; 190 void SealevelriseGeodetic(Vector<IssmDouble>* pUp,Vector<IssmDouble>* pNorth,Vector<IssmDouble>* pEast,IssmDouble* Sg,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble* xx,IssmDouble* yy,IssmDouble* zz,IssmDouble oceanarea,IssmDouble eartharea){_error_("not implemented yet!");}; 190 191 #endif 191 192 -
issm/trunk-jpl/src/c/classes/Elements/Seg.h
r20871 r20999 172 172 void SealevelriseEustatic(Vector<IssmDouble>* pSgi,IssmDouble* peustatic,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea){_error_("not implemented yet!");}; 173 173 void SealevelriseNonEustatic(Vector<IssmDouble>* pSgo,IssmDouble* Sg_old,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea){_error_("not implemented yet!");}; 174 void SealevelriseGeodetic(Vector<IssmDouble>* pUp,Vector<IssmDouble>* pNorth,Vector<IssmDouble>* pEast,IssmDouble* Sg,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble* xx,IssmDouble* yy,IssmDouble* zz,IssmDouble oceanarea,IssmDouble eartharea){_error_("not implemented yet!");}; 174 175 IssmDouble OceanArea(void){_error_("not implemented yet!");}; 175 176 IssmDouble OceanAverage(IssmDouble* Sg){_error_("not implemented yet!");}; -
issm/trunk-jpl/src/c/classes/Elements/Tetra.h
r20871 r20999 178 178 void SealevelriseEustatic(Vector<IssmDouble>* pSgi,IssmDouble* peustatic,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea){_error_("not implemented yet!");}; 179 179 void SealevelriseNonEustatic(Vector<IssmDouble>* pSgo,IssmDouble* Sg_old,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea){_error_("not implemented yet!");}; 180 void SealevelriseGeodetic(Vector<IssmDouble>* pUp,Vector<IssmDouble>* pNorth,Vector<IssmDouble>* pEast,IssmDouble* Sg,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble* xx,IssmDouble* yy,IssmDouble* zz,IssmDouble oceanarea,IssmDouble eartharea){_error_("not implemented yet!");}; 180 181 IssmDouble OceanArea(void){_error_("not implemented yet!");}; 181 182 IssmDouble OceanAverage(IssmDouble* Sg){_error_("not implemented yet!");}; -
issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
r20993 r20999 3883 3883 } 3884 3884 /*}}}*/ 3885 void Tria::SealevelriseGeodetic(Vector<IssmDouble>* pUp,Vector<IssmDouble>* pNorth,Vector<IssmDouble>* pEast,IssmDouble* Sg,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble* xx,IssmDouble* yy,IssmDouble* zz,IssmDouble oceanarea,IssmDouble eartharea){ /*{{{*/ 3886 3887 /*diverse:*/ 3888 int gsize; 3889 bool spherical=true; 3890 IssmDouble llr_list[NUMVERTICES][3]; 3891 IssmDouble xyz_list[NUMVERTICES][3]; 3892 IssmDouble area; 3893 IssmDouble I; //change in relative sea level or ice thickness 3894 IssmDouble late,longe,re; 3895 IssmDouble lati,longi,ri; 3896 IssmDouble rho_ice,rho_water,rho_earth; 3897 IssmDouble minlong=400; 3898 IssmDouble maxlong=-20; 3899 3900 /*precomputed elastic green functions:*/ 3901 IssmDouble* U_elastic_precomputed = NULL; 3902 IssmDouble* H_elastic_precomputed = NULL; 3903 int M; 3904 3905 /*computation of Green functions:*/ 3906 IssmDouble* U_elastic= NULL; 3907 IssmDouble* N_elastic= NULL; 3908 IssmDouble* E_elastic= NULL; 3909 3910 /*optimization:*/ 3911 bool store_green_functions=false; 3912 3913 /*computational flags:*/ 3914 bool computerigid = true; 3915 bool computeelastic= true; 3916 3917 /*early return if we are not on the ocean or on an ice cap:*/ 3918 if(!(this->inputs->Max(MaskIceLevelsetEnum)<0) && !IsWaterInElement()) return; 3919 3920 /*recover computational flags: */ 3921 this->parameters->FindParam(&computerigid,SealevelriseRigidEnum); 3922 this->parameters->FindParam(&computeelastic,SealevelriseElasticEnum); 3923 3924 /*early return if rigid or elastic not requested:*/ 3925 if(!computerigid && !computeelastic) return; 3926 3927 /*recover material parameters: */ 3928 rho_ice=matpar->GetMaterialParameter(MaterialsRhoIceEnum); 3929 rho_water=matpar->GetMaterialParameter(MaterialsRhoFreshwaterEnum); 3930 rho_earth=matpar->GetMaterialParameter(MaterialsEarthDensityEnum); 3931 3932 /*how many dofs are we working with here? */ 3933 this->parameters->FindParam(&gsize,MeshNumberofverticesEnum); 3934 3935 /*compute area of element:*/ 3936 area=GetAreaSpherical(); 3937 3938 /*element centroid (spherical): */ 3939 /* Where is the centroid of this element?:{{{*/ 3940 ::GetVerticesCoordinates(&llr_list[0][0],this->vertices,NUMVERTICES,spherical); 3941 3942 minlong=400; maxlong=-20; 3943 for (int i=0;i<NUMVERTICES;i++){ 3944 llr_list[i][0]=(90-llr_list[i][0]); 3945 if(llr_list[i][1]<0)llr_list[i][1]=180+(180+llr_list[i][1]); 3946 if(llr_list[i][1]>maxlong)maxlong=llr_list[i][1]; 3947 if(llr_list[i][1]<minlong)minlong=llr_list[i][1]; 3948 } 3949 if(minlong==0 && maxlong>180){ 3950 if (llr_list[0][1]==0)llr_list[0][1]=360; 3951 if (llr_list[1][1]==0)llr_list[1][1]=360; 3952 if (llr_list[2][1]==0)llr_list[2][1]=360; 3953 } 3954 3955 // correction at the north pole 3956 if(llr_list[0][0]==0)llr_list[0][1]=(llr_list[1][1]+llr_list[2][1])/2.0; 3957 if(llr_list[1][0]==0)llr_list[1][1]=(llr_list[0][1]+llr_list[2][1])/2.0; 3958 if(llr_list[2][0]==0)llr_list[2][1]=(llr_list[0][1]+llr_list[1][1])/2.0; 3959 3960 //correction at the south pole 3961 if(llr_list[0][0]==180)llr_list[0][1]=(llr_list[1][1]+llr_list[2][1])/2.0; 3962 if(llr_list[1][0]==180)llr_list[1][1]=(llr_list[0][1]+llr_list[2][1])/2.0; 3963 if(llr_list[2][0]==180)llr_list[2][1]=(llr_list[0][1]+llr_list[1][1])/2.0; 3964 3965 late=(llr_list[0][0]+llr_list[1][0]+llr_list[2][0])/3.0; 3966 longe=(llr_list[0][1]+llr_list[1][1]+llr_list[2][1])/3.0; 3967 3968 late=90-late; 3969 if(longe>180)longe=(longe-180)-180; 3970 3971 late=late/180*PI; 3972 longe=longe/180*PI; 3973 /*}}}*/ 3974 3975 /*figure out gravity center of our element (Cartesian): */ 3976 IssmDouble x_element, y_element, z_element; 3977 ::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES); 3978 x_element=(xyz_list[0][0]+xyz_list[1][0]+xyz_list[2][0])/3.0; 3979 y_element=(xyz_list[0][1]+xyz_list[1][1]+xyz_list[2][1])/3.0; 3980 z_element=(xyz_list[0][2]+xyz_list[1][2]+xyz_list[2][2])/3.0; 3981 3982 if(computeelastic){ 3983 3984 /*recover elastic Green's functions for displacement:*/ 3985 DoubleVecParam* U_parameter = static_cast<DoubleVecParam*>(this->parameters->FindParamObject(SealevelriseUElasticEnum)); _assert_(parameter); 3986 DoubleVecParam* H_parameter = static_cast<DoubleVecParam*>(this->parameters->FindParamObject(SealevelriseHElasticEnum)); _assert_(parameter); 3987 U_parameter->GetParameterValueByPointer(&U_elastic_precomputed,&M); 3988 H_parameter->GetParameterValueByPointer(&H_elastic_precomputed,&M); 3989 3990 /*initialize: */ 3991 U_elastic=xNewZeroInit<IssmDouble>(gsize); 3992 N_elastic=xNewZeroInit<IssmDouble>(gsize); 3993 E_elastic=xNewZeroInit<IssmDouble>(gsize); 3994 } 3995 3996 int* indices=xNew<int>(gsize); 3997 IssmDouble* U_values=xNewZeroInit<IssmDouble>(gsize); 3998 IssmDouble* N_values=xNewZeroInit<IssmDouble>(gsize); 3999 IssmDouble* E_values=xNewZeroInit<IssmDouble>(gsize); 4000 4001 for(int i=0;i<gsize;i++){ 4002 4003 indices[i]=i; 4004 if(computeelastic){ 4005 4006 IssmDouble alpha; 4007 IssmDouble delPhi,delLambda; 4008 4009 /*Compute alpha angle between centroid and current vertex: */ 4010 lati=latitude[i]/180*PI; longi=longitude[i]/180*PI; 4011 4012 delPhi=fabs(lati-late); delLambda=fabs(longi-longe); 4013 alpha=2.*asin(sqrt(pow(sin(delPhi/2),2.0)+cos(lati)*cos(late)*pow(sin(delLambda/2),2))); 4014 4015 /*Compute azimuths, both north and east components: */ 4016 IssmDouble dx, dy, dz, x, y, z; 4017 IssmDouble N_azim, E_azim; 4018 x = xx[i]; y = yy[i]; z = zz[i]; 4019 if(latitude[i]==90){ 4020 x=1e-12; y=1e-12; 4021 } 4022 if(latitude[i]==-90){ 4023 x=1e-12; y=1e-12; 4024 } 4025 dx = x_element-x; dy = y_element-y; dz = z_element-z; 4026 N_azim = (-z*x*dx-z*y*dy+(pow(x,2)+pow(y,2))*dz) /pow((pow(x,2)+pow(y,2))*(pow(x,2)+pow(y,2)+pow(z,2))*(pow(dx,2)+pow(dy,2)+pow(dz,2)),0.5); 4027 E_azim = (-y*dx+x*dy) /pow((pow(x,2)+pow(y,2))*(pow(dx,2)+pow(dy,2)+pow(dz,2)),0.5); 4028 4029 /*Elastic component (from Eq 17 in Adhikari et al, GMD 2015): */ 4030 int index=reCast<int,IssmDouble>(alpha/PI*(M-1)); 4031 U_elastic[i] += U_elastic_precomputed[index]; 4032 N_elastic[i] += H_elastic_precomputed[index]*N_azim; 4033 E_elastic[i] += H_elastic_precomputed[index]*E_azim; 4034 } 4035 4036 /*Add all components to the pUp solution vectors:*/ 4037 if(computerigid){ 4038 U_values[i]+=0; N_values[i]+=0; E_values[i]+=0; 4039 } 4040 if(computeelastic){ 4041 4042 if(this->inputs->Max(MaskIceLevelsetEnum)<0){ 4043 4044 /*Compute ice thickness change: */ 4045 Input* deltathickness_input=inputs->GetInput(SealevelriseDeltathicknessEnum); 4046 if (!deltathickness_input)_error_("delta thickness input needed to compute sea level rise!"); 4047 deltathickness_input->GetInputAverage(&I); 4048 4049 U_values[i]+=3*rho_ice/rho_earth*area/eartharea*I*U_elastic[i]; 4050 N_values[i]+=3*rho_ice/rho_earth*area/eartharea*I*N_elastic[i]; 4051 E_values[i]+=3*rho_ice/rho_earth*area/eartharea*I*E_elastic[i]; 4052 } 4053 else if(IsWaterInElement()) { 4054 4055 /*From Sg, recover water sea level rise:*/ 4056 I=0; for(int i=0;i<NUMVERTICES;i++) I+=Sg[this->vertices[i]->Sid()]/NUMVERTICES; 4057 4058 U_values[i]+=3*rho_water/rho_earth*area/eartharea*I*U_elastic[i]; 4059 N_values[i]+=3*rho_water/rho_earth*area/eartharea*I*N_elastic[i]; 4060 E_values[i]+=3*rho_water/rho_earth*area/eartharea*I*E_elastic[i]; 4061 } 4062 } 4063 } 4064 pUp->SetValues(gsize,indices,U_values,ADD_VAL); 4065 pNorth->SetValues(gsize,indices,N_values,ADD_VAL); 4066 pEast->SetValues(gsize,indices,E_values,ADD_VAL); 4067 4068 /*free ressources:*/ 4069 xDelete<int>(indices); 4070 xDelete<IssmDouble>(U_values); xDelete<IssmDouble>(N_values); xDelete<IssmDouble>(E_values); 4071 4072 /*Free ressources:*/ 4073 if(computeelastic) { 4074 xDelete<IssmDouble>(U_elastic); xDelete<IssmDouble>(N_elastic); xDelete<IssmDouble>(E_elastic); 4075 } 4076 4077 return; 4078 } 4079 /*}}}*/ 3885 4080 #endif 3886 3887 4081 3888 4082 #ifdef _HAVE_DAKOTA_ -
issm/trunk-jpl/src/c/classes/Elements/Tria.h
r20871 r20999 149 149 void SealevelriseEustatic(Vector<IssmDouble>* pSgi,IssmDouble* peustatic,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea); 150 150 void SealevelriseNonEustatic(Vector<IssmDouble>* pSgo,IssmDouble* Sg_old,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea); 151 void SealevelriseGeodetic(Vector<IssmDouble>* pUp,Vector<IssmDouble>* pNorth,Vector<IssmDouble>* pEast,IssmDouble* Sg,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble* xx,IssmDouble* yy,IssmDouble* zz,IssmDouble oceanarea,IssmDouble eartharea); 151 152 #endif 152 153 /*}}}*/ -
issm/trunk-jpl/src/c/classes/FemModel.cpp
r20983 r20999 2399 2399 } 2400 2400 /*}}}*/ 2401 void FemModel::SealevelriseGeodetic(Vector<IssmDouble>* pUp, Vector<IssmDouble>* pNorth, Vector<IssmDouble>* pEast, Vector<IssmDouble>* pSg, IssmDouble* latitude, IssmDouble* longitude, IssmDouble* radius, IssmDouble* xx, IssmDouble* yy, IssmDouble* zz){/*{{{*/ 2402 2403 /*serialized vectors:*/ 2404 IssmDouble* Sg=NULL; 2405 2406 IssmDouble oceanarea=0; 2407 IssmDouble oceanarea_cpu=0; 2408 IssmDouble eartharea=0; 2409 IssmDouble eartharea_cpu=0; 2410 2411 int ns,nsmax; 2412 2413 /*Serialize vectors from previous iteration:*/ 2414 Sg=pSg->ToMPISerial(); 2415 2416 /*Go through elements, and add contribution from each element to the deflection vector wg:*/ 2417 ns = elements->Size(); 2418 2419 /*First, figure out the area of the ocean, which is needed to compute the eustatic component: */ 2420 for(int i=0;i<ns;i++){ 2421 Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i)); 2422 oceanarea_cpu += element->OceanArea(); 2423 eartharea_cpu += element->GetAreaSpherical(); 2424 } 2425 ISSM_MPI_Reduce (&oceanarea_cpu,&oceanarea,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,0,IssmComm::GetComm() ); 2426 ISSM_MPI_Bcast(&oceanarea,1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm()); 2427 2428 ISSM_MPI_Reduce (&eartharea_cpu,&eartharea,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,0,IssmComm::GetComm() ); 2429 ISSM_MPI_Bcast(&eartharea,1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm()); 2430 2431 /*Figure out max of ns: */ 2432 ISSM_MPI_Reduce(&ns,&nsmax,1,ISSM_MPI_INT,ISSM_MPI_MAX,0,IssmComm::GetComm()); 2433 ISSM_MPI_Bcast(&nsmax,1,ISSM_MPI_INT,0,IssmComm::GetComm()); 2434 2435 /*Call the sea level rise core: */ 2436 for(int i=0;i<nsmax;i++){ 2437 if(i<ns){ 2438 Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i)); 2439 element->SealevelriseGeodetic(pUp,pNorth,pEast,Sg,latitude,longitude,radius,xx,yy,zz,oceanarea,eartharea); 2440 } 2441 if(i%100==0){ 2442 pUp->Assemble(); 2443 pNorth->Assemble(); 2444 pEast->Assemble(); 2445 } 2446 } 2447 2448 /*One last time: */ 2449 pUp->Assemble(); 2450 pNorth->Assemble(); 2451 pEast->Assemble(); 2452 2453 /*Free ressources:*/ 2454 xDelete<IssmDouble>(Sg); 2455 xDelete<IssmDouble>(latitude); 2456 xDelete<IssmDouble>(longitude); 2457 xDelete<IssmDouble>(radius); 2458 xDelete<IssmDouble>(xx); 2459 xDelete<IssmDouble>(yy); 2460 xDelete<IssmDouble>(zz); 2461 } 2462 /*}}}*/ 2401 2463 IssmDouble FemModel::SealevelriseOceanAverage(Vector<IssmDouble>* Sg) { /*{{{*/ 2402 2464 … … 2423 2485 ISSM_MPI_Reduce (&oceanvalue_cpu,&oceanvalue,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,0,IssmComm::GetComm() ); 2424 2486 ISSM_MPI_Bcast(&oceanvalue,1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm()); 2425 2426 2487 2427 2488 /*Free ressources:*/ -
issm/trunk-jpl/src/c/classes/FemModel.h
r20935 r20999 116 116 void SealevelriseEustatic(Vector<IssmDouble>* pSgi, IssmDouble* peustatic, IssmDouble* latitude, IssmDouble* longitude, IssmDouble* radius); 117 117 void SealevelriseNonEustatic(Vector<IssmDouble>* pSgo, Vector<IssmDouble>* pSg_old, IssmDouble* latitude, IssmDouble* longitude, IssmDouble* radius,bool verboseconvolution); 118 void SealevelriseGeodetic(Vector<IssmDouble>* pUp, Vector<IssmDouble>* pNorth, Vector<IssmDouble>* pEast, Vector<IssmDouble>* pSg_old, IssmDouble* latitude, IssmDouble* longitude, IssmDouble* radius, IssmDouble* xx, IssmDouble* yy, IssmDouble* zz); 118 119 IssmDouble SealevelriseOceanAverage(Vector<IssmDouble>* Sg); 119 120 #endif -
issm/trunk-jpl/src/c/cores/sealevelrise_core.cpp
r20348 r20999 13 13 14 14 Vector<IssmDouble> *Sg = NULL; 15 Vector<IssmDouble> *Sg_eustatic = NULL; 15 Vector<IssmDouble> *Sg_absolute = NULL; 16 Vector<IssmDouble> *Sg_eustatic = NULL; 17 Vector<IssmDouble> *U_radial = NULL; 18 Vector<IssmDouble> *U_north = NULL; 19 Vector<IssmDouble> *U_east = NULL; 16 20 bool save_results,isslr,iscoupler; 17 21 int configuration_type; … … 20 24 char **requested_outputs = NULL; 21 25 26 /*additional parameters: */ 27 int gsize; 28 bool spherical=true; 29 IssmDouble *latitude = NULL; 30 IssmDouble *longitude = NULL; 31 IssmDouble *radius = NULL; 32 IssmDouble *xx = NULL; 33 IssmDouble *yy = NULL; 34 IssmDouble *zz = NULL; 35 22 36 /*Recover some parameters: */ 23 37 femmodel->parameters->FindParam(&configuration_type,ConfigurationTypeEnum); … … 26 40 femmodel->parameters->FindParam(&isslr,TransientIsslrEnum); 27 41 femmodel->parameters->FindParam(&iscoupler,TransientIscouplerEnum); 42 43 /*first, recover lat,long and radius vectors from vertices: */ 44 VertexCoordinatesx(&latitude,&longitude,&radius,femmodel->vertices,spherical); 45 46 /*recover x,y,z vectors from vertices: */ 47 VertexCoordinatesx(&xx,&yy,&zz,femmodel->vertices); 48 49 /*Figure out size of g-set deflection vector and allocate solution vector: */ 50 gsize = femmodel->nodes->NumberOfDofs(configuration_type,GsetEnum); 28 51 29 52 /*several cases here, depending on value of iscoupler and isslr: … … 57 80 58 81 Sg=sealevelrise_core_noneustatic(femmodel,Sg_eustatic); //ocean loading tems (2nd and 5th terms on the RHS of Farrel and Clark) 59 82 60 83 /*get results into elements:*/ 61 InputUpdateFromSolutionx(femmodel,Sg); 62 84 //InputUpdateFromSolutionx(femmodel,Sg); // from Eric 85 InputUpdateFromVectorx(femmodel,Sg,SealevelEnum,VertexSIdEnum); 86 87 /*compute other geodetic signatures, such as absolute sea level chagne, components of 3-D crustal motion: */ 88 /*Initialize:*/ 89 U_radial = new Vector<IssmDouble>(gsize); 90 U_north = new Vector<IssmDouble>(gsize); 91 U_east = new Vector<IssmDouble>(gsize); 92 Sg_absolute = new Vector<IssmDouble>(gsize); 93 94 /*call the geodetic main modlule:*/ 95 femmodel->SealevelriseGeodetic(U_radial,U_north,U_east,Sg,latitude,longitude,radius,xx,yy,zz); 96 97 /*compute: absolute sea level change = relative sea level change + vertical motion*/ 98 Sg->Copy(Sg_absolute); Sg_absolute->AXPY(U_radial,1); 99 100 /*get results into elements:*/ 101 InputUpdateFromVectorx(femmodel,U_radial,SealevelUmotionEnum,VertexSIdEnum); // radial displacement 102 InputUpdateFromVectorx(femmodel,U_north,SealevelNmotionEnum,VertexSIdEnum); // north motion 103 InputUpdateFromVectorx(femmodel,U_east,SealevelEmotionEnum,VertexSIdEnum); // east motion 104 InputUpdateFromVectorx(femmodel,Sg_absolute,SealevelAbsoluteEnum,VertexSIdEnum); 105 63 106 if(save_results){ 64 107 if(VerboseSolution()) _printf0_(" saving results\n"); … … 66 109 femmodel->RequestedOutputsx(&femmodel->results,requested_outputs,numoutputs); 67 110 } 68 111 69 112 if(solution_type==SealevelriseSolutionEnum)femmodel->RequestedDependentsx(); 70 113 … … 72 115 delete Sg; 73 116 delete Sg_eustatic; 117 delete U_radial; 118 delete U_north; 119 delete U_east; 120 delete Sg_absolute; 74 121 if(numoutputs){for(int i=0;i<numoutputs;i++){xDelete<char>(requested_outputs[i]);} xDelete<char*>(requested_outputs);} 75 122 } -
issm/trunk-jpl/src/c/cores/sealevelrise_core_eustatic.cpp
r20367 r20999 58 58 return Sgi; 59 59 } 60 -
issm/trunk-jpl/src/c/cores/sealevelrise_core_noneustatic.cpp
r20007 r20999 12 12 void slrconvergence(bool* pconverged, Vector<IssmDouble>* Sg,Vector<IssmDouble>* Sg_old,IssmDouble eps_rel,IssmDouble eps_abs); 13 13 14 Vector<IssmDouble>* sealevelrise_core_noneustatic(FemModel* femmodel,Vector<IssmDouble>* Sg_eustatic){ 14 Vector<IssmDouble>* sealevelrise_core_noneustatic(FemModel* femmodel,Vector<IssmDouble>* Sg_eustatic){ /*{{{*/ 15 15 16 16 Vector<IssmDouble> *Sg = NULL; … … 35 35 IssmDouble *radius = NULL; 36 36 IssmDouble eustatic; 37 38 37 39 38 /*Recover some parameters: */ … … 112 111 113 112 return Sg; 114 } 113 } /*}}}*/ 115 114 116 115 void slrconvergence(bool* pconverged, Vector<IssmDouble>* Sg,Vector<IssmDouble>* Sg_old,IssmDouble eps_rel,IssmDouble eps_abs){ /*{{{*/ … … 157 156 158 157 } /*}}}*/ 158 -
issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
r20983 r20999 1065 1065 SealevelriseAnalysisEnum, 1066 1066 SealevelEnum, 1067 SealevelUmotionEnum, 1068 SealevelNmotionEnum, 1069 SealevelEmotionEnum, 1070 SealevelAbsoluteEnum, 1067 1071 SealevelEustaticEnum, 1068 1072 SealevelriseDeltathicknessEnum, … … 1078 1082 SealevelriseRotationEnum, 1079 1083 SealevelriseGElasticEnum, 1084 SealevelriseUElasticEnum, 1085 SealevelriseHElasticEnum, 1080 1086 SealevelriseDegaccEnum, 1081 1087 SealevelriseTransitionsEnum, -
issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
r20983 r20999 1017 1017 case SealevelriseAnalysisEnum : return "SealevelriseAnalysis"; 1018 1018 case SealevelEnum : return "Sealevel"; 1019 case SealevelUmotionEnum : return "SealevelUmotion"; 1020 case SealevelNmotionEnum : return "SealevelNmotion"; 1021 case SealevelEmotionEnum : return "SealevelEmotion"; 1022 case SealevelAbsoluteEnum : return "SealevelAbsolute"; 1019 1023 case SealevelEustaticEnum : return "SealevelEustatic"; 1020 1024 case SealevelriseDeltathicknessEnum : return "SealevelriseDeltathickness"; … … 1030 1034 case SealevelriseRotationEnum : return "SealevelriseRotation"; 1031 1035 case SealevelriseGElasticEnum : return "SealevelriseGElastic"; 1036 case SealevelriseUElasticEnum : return "SealevelriseUElastic"; 1037 case SealevelriseHElasticEnum : return "SealevelriseHElastic"; 1032 1038 case SealevelriseDegaccEnum : return "SealevelriseDegacc"; 1033 1039 case SealevelriseTransitionsEnum : return "SealevelriseTransitions"; -
issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
r20983 r20999 1041 1041 else if (strcmp(name,"SealevelriseAnalysis")==0) return SealevelriseAnalysisEnum; 1042 1042 else if (strcmp(name,"Sealevel")==0) return SealevelEnum; 1043 else if (strcmp(name,"SealevelUmotion")==0) return SealevelUmotionEnum; 1044 else if (strcmp(name,"SealevelNmotion")==0) return SealevelNmotionEnum; 1045 else if (strcmp(name,"SealevelEmotion")==0) return SealevelEmotionEnum; 1046 else if (strcmp(name,"SealevelAbsolute")==0) return SealevelAbsoluteEnum; 1043 1047 else if (strcmp(name,"SealevelEustatic")==0) return SealevelEustaticEnum; 1044 1048 else if (strcmp(name,"SealevelriseDeltathickness")==0) return SealevelriseDeltathicknessEnum; … … 1054 1058 else if (strcmp(name,"SealevelriseRotation")==0) return SealevelriseRotationEnum; 1055 1059 else if (strcmp(name,"SealevelriseGElastic")==0) return SealevelriseGElasticEnum; 1060 else if (strcmp(name,"SealevelriseUElastic")==0) return SealevelriseUElasticEnum; 1061 else if (strcmp(name,"SealevelriseHElastic")==0) return SealevelriseHElasticEnum; 1056 1062 else if (strcmp(name,"SealevelriseDegacc")==0) return SealevelriseDegaccEnum; 1057 1063 else if (strcmp(name,"SealevelriseTransitions")==0) return SealevelriseTransitionsEnum;
Note:
See TracChangeset
for help on using the changeset viewer.