Changeset 26283
- Timestamp:
- 05/19/21 16:03:18 (4 years ago)
- Location:
- issm/trunk-jpl
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/SealevelchangeAnalysis.cpp
r26278 r26283 338 338 for(int i=lower_row;i<upper_row;i++){ 339 339 IssmDouble alpha,x; 340 alpha= reCast<IssmDouble>(i)*degacc * PI / 180.0;340 alpha= reCast<IssmDouble>(i)*degacc * M_PI / 180.0; 341 341 G_rigid_local[i-lower_row]= .5/sin(alpha/2.0); 342 342 } … … 345 345 for(int i=lower_row;i<upper_row;i++){ 346 346 IssmDouble alpha,x; 347 alpha= reCast<IssmDouble>(i)*degacc * PI / 180.0;347 alpha= reCast<IssmDouble>(i)*degacc * M_PI / 180.0; 348 348 349 349 for(int t=0;t<ntimesteps;t++){ … … 478 478 int timeindex=index*nt+t; 479 479 int timepreindex= index*ntimesteps+timeindex2; 480 G_viscoelastic_interpolated[timeindex] +=(1-lincoeff)*G_viscoelastic[timepreindex]+lincoeff*G_viscoelastic[timepreindex+1];481 U_viscoelastic_interpolated[timeindex] +=(1-lincoeff)*U_viscoelastic[timepreindex]+lincoeff*U_viscoelastic[timepreindex+1];482 if(horiz)H_viscoelastic_interpolated[timeindex] +=(1-lincoeff)*H_viscoelastic[timepreindex]+lincoeff*H_viscoelastic[timepreindex+1];480 G_viscoelastic_interpolated[timeindex]=(1-lincoeff)*G_viscoelastic[timepreindex]+lincoeff*G_viscoelastic[timepreindex+1]; 481 U_viscoelastic_interpolated[timeindex]=(1-lincoeff)*U_viscoelastic[timepreindex]+lincoeff*U_viscoelastic[timepreindex+1]; 482 if(horiz)H_viscoelastic_interpolated[timeindex]=(1-lincoeff)*H_viscoelastic[timepreindex]+lincoeff*H_viscoelastic[timepreindex+1]; 483 483 } 484 484 } -
issm/trunk-jpl/src/c/classes/BarystaticContributions.cpp
r26149 r26283 131 131 132 132 } /*}}}*/ 133 void BarystaticContributions::Reset(int eid){ /*{{{*/ 134 135 int id; 136 if(nice){ 137 id=reCast<int>(pice[eid]); 138 ice->SetValue(id,0.,INS_VAL); 139 } 140 else{ 141 ice->SetValue(0,0.,INS_VAL); 142 } 143 144 if(nhydro){ 145 id=reCast<int>(phydro[eid]); 146 hydro->SetValue(id,0.,INS_VAL); 147 } 148 else{ 149 hydro->SetValue(0,0.,INS_VAL); 150 } 151 152 if(nocean){ 153 id=reCast<int>(pocean[eid]); 154 ocean->SetValue(id,0.,INS_VAL); 155 } 156 else{ 157 ocean->SetValue(0,0.,INS_VAL); 158 } 159 160 161 } /*}}}*/ 133 162 void BarystaticContributions::Save(Results* results, Parameters* parameters, IssmDouble oceanarea){ /*{{{*/ 134 163 -
issm/trunk-jpl/src/c/classes/BarystaticContributions.h
r26121 r26283 42 42 void Save(Results* results, Parameters* parameters, IssmDouble oceanarea); 43 43 void Set(int eid, IssmDouble icevalue, IssmDouble hydrovalue, IssmDouble oceanvalue); 44 void Reset(int eid); 44 45 45 46 }; -
issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
r26276 r26283 6218 6218 } 6219 6219 6220 6220 6221 constant=3/rho_earth/planetarea; 6221 6222 … … 6245 6246 alpha=2.*asin(sqrt(pow(sin(delPhi/2),2)+cos(lati)*cos(late)*pow(sin(delLambda/2),2))); 6246 6247 index=reCast<int,IssmDouble>( alpha/M_PI*reCast<IssmDouble,int>(M-1) ); 6247 _assert_(index> 0 && index<M);6248 _assert_(index>=0 && index<M); 6248 6249 6249 6250 if(horiz){ … … 6382 6383 this->inputs->SetArrayInput(StackRSLEnum,this->lid,stackRSL,3*nt); 6383 6384 this->inputs->SetArrayInput(StackUEnum,this->lid,stackU,3*nt); 6385 this->parameters->SetParam(0,StackIndexEnum); 6384 6386 if(horiz){ 6385 6387 stackN=xNewZeroInit<IssmDouble>(3*nt); … … 6955 6957 IssmDouble* stacktimes=NULL; 6956 6958 int stacknumsteps; 6957 int stackindex ;6958 int newindex ;6959 int stackindex=0; 6960 int newindex=0; 6959 6961 int dummy; 6960 6962 bool viscous=false; … … 6980 6982 } 6981 6983 6984 6985 bool foundtime=false; 6986 int offset=1; 6982 6987 lincoeff=0; 6983 6988 newindex=stacknumsteps-2; 6989 6984 6990 for(int t=stackindex;t<stacknumsteps;t++){ 6985 6991 if (stacktimes[t]>currenttime){ 6986 6992 newindex=t-1; 6987 6993 lincoeff=(currenttime-stacktimes[newindex])/(stacktimes[t]-stacktimes[newindex]); 6994 foundtime=true; 6995 offset=0; 6988 6996 break; 6989 6997 } 6990 6998 } 6991 if(newindex==(stacknumsteps-2))lincoeff=1; 6999 7000 if(!foundtime) lincoeff=1; 6992 7001 stacktimes[newindex]=currenttime; 6993 7002 for(int i=0;i<NUMVERTICES;i++){ 6994 stackRSL[i*stacknumsteps+newindex ]=(1-lincoeff)*stackRSL[i*stacknumsteps+newindex]+lincoeff*stackRSL[i*stacknumsteps+newindex+1];6995 stackU[i*stacknumsteps+newindex ]=(1-lincoeff)*stackU[i*stacknumsteps+newindex]+lincoeff*stackU[i*stacknumsteps+newindex+1];7003 stackRSL[i*stacknumsteps+newindex+offset]=(1-lincoeff)*stackRSL[i*stacknumsteps+newindex]+lincoeff*stackRSL[i*stacknumsteps+newindex+1]; 7004 stackU[i*stacknumsteps+newindex+offset]=(1-lincoeff)*stackU[i*stacknumsteps+newindex]+lincoeff*stackU[i*stacknumsteps+newindex+1]; 6996 7005 if(horiz){ 6997 stackN[i*stacknumsteps+newindex]=(1-lincoeff)*stackN[i*stacknumsteps+newindex]+lincoeff*stackN[i*stacknumsteps+newindex+1]; 6998 stackE[i*stacknumsteps+newindex]=(1-lincoeff)*stackE[i*stacknumsteps+newindex]+lincoeff*stackE[i*stacknumsteps+newindex+1]; 6999 } 7000 } 7001 stackindex=newindex; 7002 7006 stackN[i*stacknumsteps+newindex+offset]=(1-lincoeff)*stackN[i*stacknumsteps+newindex]+lincoeff*stackN[i*stacknumsteps+newindex+1]; 7007 stackE[i*stacknumsteps+newindex+offset]=(1-lincoeff)*stackE[i*stacknumsteps+newindex]+lincoeff*stackE[i*stacknumsteps+newindex+1]; 7008 } 7009 } 7010 stackindex=newindex+offset; 7011 7012 7003 7013 this->parameters->SetParam(stackindex,StackIndexEnum); 7004 7014 this->parameters->SetParam(stacktimes,stacknumsteps,StackTimesEnum); … … 7162 7172 int intj=slgeom->subelementmapping[SLGEOM_OCEAN][this->lid]; 7163 7173 loads->vsubsealevelloads->SetValue(intj,oceanaverage*rho_water,INS_VAL); 7174 loads->vsealevelloads->SetValue(this->sid,0.,INS_VAL); 7164 7175 } 7165 7176 else loads->vsealevelloads->SetValue(this->sid,oceanaverage*rho_water,INS_VAL); 7177 7166 7178 7167 7179 /*add ocean area into a global oceanareas vector:*/ … … 7395 7407 sealevelinterp=xNew<IssmDouble>(3*nt); 7396 7408 if(stacktimes[stackindex]<final_time){ 7397 lincoeff= 1-(stacktimes[stackindex+1]-stacktimes[stackindex])/timeacc;7409 lincoeff=(stacktimes[stackindex+1]-stacktimes[stackindex])/timeacc; 7398 7410 for(int t=stackindex;t<nt;t++){ 7399 7411 if(t==stackindex){ 7400 7412 for(int i=0;i<NUMVERTICES;i++){ 7413 if(slgeom->lids[this->vertices[i]->lid]!=this->lid)continue; 7401 7414 sealevelinterp[i*nt+t]= sealevel[i*nt+0]; 7402 7415 } … … 7404 7417 else{ 7405 7418 for(int i=0;i<NUMVERTICES;i++){ 7419 if(slgeom->lids[this->vertices[i]->lid]!=this->lid)continue; 7406 7420 sealevelinterp[i*nt+t]= (1-lincoeff)*sealevel[i*nt+(t-stackindex-1)]+lincoeff*sealevel[i*nt+(t-stackindex)]; 7407 7421 } … … 7413 7427 /*update sealevel at present time using stack at present time: */ 7414 7428 for(int i=0;i<NUMVERTICES;i++){ 7429 if(slgeom->lids[this->vertices[i]->lid]!=this->lid)continue; 7415 7430 sealevel[i*nt+0]+=stack[i*stacknumsteps+stackindex]; 7416 7431 } 7417 7432 7418 7433 if(computefuture){ /*update stack with future deformation from present load: */ 7419 for(int t=stackindex;t<nt;t++){ 7434 7435 for(int t=nt-1;t>=stackindex;t--){ 7420 7436 for(int i=0;i<NUMVERTICES;i++){ 7421 stack[i*stacknumsteps+t]+=sealevelinterp[i*nt+t]; 7437 if(slgeom->lids[this->vertices[i]->lid]!=this->lid)continue; 7438 stack[i*stacknumsteps+t]+=sealevelinterp[i*nt+t]-sealevelinterp[i*nt+stackindex]-stack[i*stacknumsteps+stackindex]; 7422 7439 } 7423 7440 } … … 7433 7450 if(percpu){ 7434 7451 for(i=0;i<NUMVERTICES;i++){ 7435 if(slgeom->lids[this->vertices[i]->lid]==this->lid)sealevelout[this->vertices[i]->lid]=sealevel[i*nt+0]; 7452 if(slgeom->lids[this->vertices[i]->lid]==this->lid){ 7453 sealevelout[this->vertices[i]->lid]=sealevel[i*nt+0]; 7454 } 7436 7455 } 7437 7456 } … … 7439 7458 for(i=0;i<NUMVERTICES;i++) sealevelout[i]=sealevel[i*nt+0]; 7440 7459 } 7460 7441 7461 7442 7462 } /*}}}*/ -
issm/trunk-jpl/src/c/cores/sealevelchange_core.cpp
r26272 r26283 388 388 barycontrib->Cumulate(femmodel->parameters); 389 389 barycontrib->Save(femmodel->results,femmodel->parameters,oceanarea); 390 391 //Avoid double counting barystatic contributions in future time steps: reset all non-cumulative bscl to 0 392 for(Object* & object : femmodel->elements->objects){ 393 Element* element = xDynamicCast<Element*>(object); 394 barycontrib->Reset(element->Sid()); 395 } 390 396 } 391 397 … … 714 720 delete vsubsealevelloadsvolume; 715 721 716 //return (sealevelloadsaverage+subsealevelloadsaverage)/oceanarea; 717 return (sealevelloadsaverage)/oceanarea; 722 return (sealevelloadsaverage+subsealevelloadsaverage)/oceanarea; 718 723 } /*}}}*/ 719 724 void RotationAxisMotion(IssmDouble* m, FemModel* femmodel,GrdLoads* loads, SealevelGeometry* slgeom){ /*{{{*/ -
issm/trunk-jpl/test/NightlyRun/test2090.m
r26272 r26283 3 3 %mesh earth: 4 4 md=model; 5 md.mesh=gmshplanet('radius',6.371012*10^3,'resolution', 500.); %700 km resolution mesh5 md.mesh=gmshplanet('radius',6.371012*10^3,'resolution',700.); %700 km resolution mesh 6 6 7 7 %Geometry for the bed, arbitrary thickness of 1000: 8 8 md.geometry.bed=-ones(md.mesh.numberofvertices,1); 9 9 md.geometry.base=md.geometry.bed; 10 md.geometry.thickness=100 0*ones(md.mesh.numberofvertices,1);10 md.geometry.thickness=100*ones(md.mesh.numberofvertices,1); 11 11 md.geometry.surface=md.geometry.bed+md.geometry.thickness; 12 12 … … 15 15 %solidearth loading: {{{ 16 16 md.masstransport.spcthickness=[md.geometry.thickness;0]; 17 md.dsl.global_average_thermosteric_sea_level=[0;0]; 18 md.dsl.sea_surface_height_above_geoid=zeros(md.mesh.numberofvertices+1,1); 19 md.dsl.sea_water_pressure_at_sea_floor=zeros(md.mesh.numberofvertices+1,1); 17 20 18 md.smb.mass_balance=zeros(md.mesh.numberofvertices,1); 21 19 %antarctica … … 28 26 longe=atan2d(ye,xe); 29 27 pos=find(late < -80); 30 md.masstransport.spcthickness(md.mesh.elements(pos,:))= md.masstransport.spcthickness(md.mesh.elements(pos,:))-100; 28 %pos=10; 29 md.masstransport.spcthickness(md.mesh.elements(pos,:))=md.masstransport.spcthickness(md.mesh.elements(pos,:)) -100; 31 30 posant=pos; 32 31 %greenland 33 32 pos=find(late>60 & late<90 & longe>-75 & longe<-15); 34 md.masstransport.spcthickness(md.mesh.elements(pos,:))= md.masstransport.spcthickness(md.mesh.elements(pos,:))-100;33 md.masstransport.spcthickness(md.mesh.elements(pos,:))=md.masstransport.spcthickness(md.mesh.elements(pos,:)) -100; 35 34 posgre=pos; 36 35 … … 39 38 load ../Data/lnb_temporal.mat 40 39 md.solidearth.lovenumbers=lovenumbers('maxdeg',1000); 41 md.solidearth.lovenumbers.h=[zeros(1,100); h1]; 42 md.solidearth.lovenumbers.k=[zeros(1,100); k1]; 43 md.solidearth.lovenumbers.l=[zeros(1,100); l1]; 44 md.solidearth.lovenumbers.th=repmat(md.solidearth.lovenumbers.th,1,100); 45 md.solidearth.lovenumbers.tk=repmat(md.solidearth.lovenumbers.tk,1,100); 46 md.solidearth.lovenumbers.tl=repmat(md.solidearth.lovenumbers.tl,1,100); 40 md.solidearth.lovenumbers.timefreq=[0]; 41 42 md.solidearth.lovenumbers.h=[h1']; 43 md.solidearth.lovenumbers.k=[k1']; 44 md.solidearth.lovenumbers.l=[l1']; 45 %md.solidearth.lovenumbers.h=repmat(md.solidearth.lovenumbers.h,1,100); 46 %md.solidearth.lovenumbers.k=repmat(md.solidearth.lovenumbers.k,1,100); 47 %md.solidearth.lovenumbers.l=repmat(md.solidearth.lovenumbers.l,1,100); 48 md.solidearth.lovenumbers.th=repmat(md.solidearth.lovenumbers.th,1,101); 49 md.solidearth.lovenumbers.tk=repmat(md.solidearth.lovenumbers.tk,1,101); 50 md.solidearth.lovenumbers.tl=repmat(md.solidearth.lovenumbers.tl,1,101); 47 51 md.solidearth.lovenumbers.timefreq=time; 48 52 … … 56 60 icemask(md.mesh.elements(posant))=-1; 57 61 icemask(md.mesh.elements(posgre))=-1; 62 %oceanmask(md.mesh.elements(posant))=1; 58 63 59 64 md.mask.ice_levelset=icemask; … … 63 68 %time stepping: 64 69 md.timestepping.start_time=0; 65 md.timestepping.time_step=1; 66 md.timestepping.final_time=10; 70 md.timestepping.time_step=100; 71 md.timestepping.final_time=1000; 72 73 time1=md.timestepping.start_time:md.timestepping.time_step:md.timestepping.final_time; 74 md.masstransport.spcthickness=repmat(md.masstransport.spcthickness, [1 length(time1)]); 75 md.masstransport.spcthickness(1:end-1,2:end)=0; 76 md.masstransport.spcthickness(end,:)=time1; 67 77 68 78 md.basalforcings.groundedice_melting_rate=zeros(md.mesh.numberofvertices,1); … … 82 92 83 93 %Solution parameters 84 md.cluster.np= 3;94 md.cluster.np=1; 85 95 md.solidearth.settings.reltol=NaN; 86 96 md.solidearth.settings.abstol=1e-3; … … 89 99 md.solidearth.settings.ocean_area_scaling=0; 90 100 md.solidearth.settings.grdmodel=1; 101 md.solidearth.settings.timeacc=md.timestepping.time_step; 102 md.solidearth.settings.degacc=.01; 91 103 92 %Physics: 104 %Physics: 93 105 md.transient.issmb=0; 94 106 md.transient.isstressbalance=0; … … 96 108 md.transient.ismasstransport=1; 97 109 md.transient.isslc=1; 98 md.solidearth.requested_outputs={'Sealevel','Bed','BedGRD'}; 99 110 md.solidearth.requested_outputs={'Sealevel','Bed'}; 100 111 101 112 % max number of iteration reverted back to 10 (i.e., the original default value) … … 105 116 md.solidearth.settings.rigid=1; 106 117 md.solidearth.settings.elastic=1; 118 md.solidearth.settings.viscous=1; 107 119 md.solidearth.settings.rotation=0; 108 120 md=solve(md,'tr'); 109 S=md.results.TransientSolution.Sealevel; 121 122 123 clear S B 124 for i=length(time1)-1 125 S(:,i)=md.results.TransientSolution(i).Sealevel; 126 B(:,i)=md.results.TransientSolution(i).Bed; 127 end 110 128 111 129 %Fields and tolerances to track changes 112 field_names={'Sealevel' };113 field_tolerances={1e-13 };114 field_values={S };130 field_names={'Sealevel','Bed'}; 131 field_tolerances={1e-13,1e-13}; 132 field_values={S,B};
Note:
See TracChangeset
for help on using the changeset viewer.