Changeset 24136
- Timestamp:
- 09/09/19 02:54:07 (6 years ago)
- Location:
- issm/trunk-jpl
- Files:
-
- 2 added
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp ¶
r24060 r24136 567 567 IssmDouble h,hx,hy,hz,vx,vy,vz; 568 568 IssmDouble tau_parameter,diameter; 569 IssmDouble tau_parameter_anisotropic[2],tau_parameter_hor,tau_parameter_ver; 569 570 IssmDouble D_scalar; 570 571 IssmDouble* xyz_list = NULL; … … 595 596 Input* vym_input = element->GetInput(VyMeshEnum); _assert_(vym_input); 596 597 Input* vzm_input = element->GetInput(VzMeshEnum); _assert_(vzm_input); 597 if(stabilization==2) diameter=element->MinEdgeLength(xyz_list);598 598 599 599 /*Enthalpy diffusion parameter*/ … … 660 660 &Ke->values[0],1); 661 661 } 662 /*SUPG*/ 662 663 else if(stabilization==2){ 663 664 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss); 665 diameter=element->MinEdgeLength(xyz_list); 664 666 tau_parameter=element->StabilizationParameter(u-um,v-vm,w-wm,diameter,kappa/rho_ice); 665 667 for(int i=0;i<numnodes;i++){ 666 668 for(int j=0;j<numnodes;j++){ 667 669 Ke->values[i*numnodes+j]+=tau_parameter*D_scalar* 668 ((u-um)*dbasis[0*numnodes+i]+(v-vm)*dbasis[1*numnodes+i]+(w-wm)*dbasis[2*numnodes+i])*((u-um)*dbasis[0*numnodes+j]+(v-vm)*dbasis[1*numnodes+j]+(w-wm)*dbasis[2*numnodes+j]); 670 ((u-um)*dbasis[0*numnodes+i]+(v-vm)*dbasis[1*numnodes+i]+(w-wm)*dbasis[2*numnodes+i])* 671 ((u-um)*dbasis[0*numnodes+j]+(v-vm)*dbasis[1*numnodes+j]+(w-wm)*dbasis[2*numnodes+j]); 669 672 } 670 673 } … … 678 681 } 679 682 } 683 /*anisotropic SUPG*/ 684 else if(stabilization==3){ 685 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss); 686 element->ElementSizes(&hx,&hy,&hz); 687 element->StabilizationParameterAnisotropic(&tau_parameter_anisotropic[0],u-um,v-vm,w-wm,hx,hy,hz,kappa/rho_ice); 688 tau_parameter_hor=tau_parameter_anisotropic[0]; 689 tau_parameter_ver=tau_parameter_anisotropic[1]; 690 for(int i=0;i<numnodes;i++){ 691 for(int j=0;j<numnodes;j++){ 692 Ke->values[i*numnodes+j]+=D_scalar* 693 (sqrt(tau_parameter_hor)*(u-um)*dbasis[0*numnodes+i]+sqrt(tau_parameter_hor)*(v-vm)*dbasis[1*numnodes+i]+sqrt(tau_parameter_ver)*(w-wm)*dbasis[2*numnodes+i])* 694 (sqrt(tau_parameter_hor)*(u-um)*dbasis[0*numnodes+j]+sqrt(tau_parameter_hor)*(v-vm)*dbasis[1*numnodes+j]+sqrt(tau_parameter_ver)*(w-wm)*dbasis[2*numnodes+j]); 695 } 696 } 697 } 680 698 } 681 699 … … 769 787 IssmDouble pressure, d1pressure[3], d2pressure; 770 788 IssmDouble waterfractionpicard; 771 IssmDouble kappa,tau_parameter,diameter,kappa_w; 789 IssmDouble kappa,tau_parameter,diameter,hx,hy,hz,kappa_w; 790 IssmDouble tau_parameter_anisotropic[2],tau_parameter_hor,tau_parameter_ver; 772 791 IssmDouble u,v,w; 773 792 IssmDouble scalar_def, scalar_sens ,scalar_transient; … … 801 820 Input* enthalpy_input=NULL; 802 821 if(reCast<bool,IssmDouble>(dt)){enthalpy_input = element->GetInput(EnthalpyEnum); _assert_(enthalpy_input);} 803 if(stabilization==2){804 diameter=element->MinEdgeLength(xyz_list);805 kappa=this->EnthalpyDiffusionParameterVolume(element,EnthalpyPicardEnum); _assert_(kappa>=0.);806 }807 822 808 823 /* Start looping on the number of gaussian points: */ … … 848 863 for(i=0;i<numnodes;i++) pe->values[i]+=scalar_transient*basis[i]; 849 864 } 850 865 866 /* SUPG */ 851 867 if(stabilization==2){ 852 868 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss); 853 869 diameter=element->MinEdgeLength(xyz_list); 870 kappa=this->EnthalpyDiffusionParameterVolume(element,EnthalpyPicardEnum); _assert_(kappa>=0.); 854 871 vx_input->GetInputValue(&u,gauss); 855 872 vy_input->GetInputValue(&v,gauss); … … 862 879 for(i=0;i<numnodes;i++) pe->values[i]+=tau_parameter*scalar_transient*(u*dbasis[0*numnodes+i]+v*dbasis[1*numnodes+i]+w*dbasis[2*numnodes+i]); 863 880 } 881 } 882 /* anisotropic SUPG */ 883 else if(stabilization==3){ 884 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss); 885 element->ElementSizes(&hx,&hy,&hz); 886 kappa=this->EnthalpyDiffusionParameterVolume(element,EnthalpyPicardEnum); _assert_(kappa>=0.); 887 vx_input->GetInputValue(&u,gauss); 888 vy_input->GetInputValue(&v,gauss); 889 vz_input->GetInputValue(&w,gauss); 890 element->StabilizationParameterAnisotropic(&tau_parameter_anisotropic[0],u,v,w,hx,hy,hz,kappa/rho_ice); 891 tau_parameter_hor=tau_parameter_anisotropic[0]; 892 tau_parameter_ver=tau_parameter_anisotropic[1]; 893 894 for(i=0;i<numnodes;i++) pe->values[i]+=scalar_def*(tau_parameter_hor*u*dbasis[0*numnodes+i]+tau_parameter_hor*v*dbasis[1*numnodes+i]+tau_parameter_ver*w*dbasis[2*numnodes+i]); 864 895 } 865 896 } -
TabularUnified issm/trunk-jpl/src/c/analyses/ThermalAnalysis.cpp ¶
r24093 r24136 378 378 IssmDouble h,hx,hy,hz,vx,vy,vz,D_scalar; 379 379 IssmDouble tau_parameter,diameter; 380 IssmDouble tau_parameter_anisotropic[2],tau_parameter_hor,tau_parameter_ver; 380 381 IssmDouble* xyz_list = NULL; 381 382 … … 406 407 Input* vym_input = element->GetInput(VyMeshEnum); _assert_(vym_input); 407 408 Input* vzm_input = element->GetInput(VzMeshEnum); _assert_(vzm_input); 408 if(stabilization==2) diameter=element->MinEdgeLength(xyz_list);409 409 410 410 /* Start looping on the number of gaussian points: */ … … 469 469 } 470 470 else if(stabilization==2){ 471 diameter=element->MinEdgeLength(xyz_list); 471 472 tau_parameter=element->StabilizationParameter(u-um,v-vm,w-wm,diameter,kappa); 472 473 for(int i=0;i<numnodes;i++){ 473 474 for(int j=0;j<numnodes;j++){ 474 475 Ke->values[i*numnodes+j]+=tau_parameter*D_scalar* 475 ((u-um)*dbasis[0*numnodes+i]+(v-vm)*dbasis[1*numnodes+i]+(w-wm)*dbasis[2*numnodes+i])*((u-um)*dbasis[0*numnodes+j]+(v-vm)*dbasis[1*numnodes+j]+(w-wm)*dbasis[2*numnodes+j]); 476 ((u-um)*dbasis[0*numnodes+i]+(v-vm)*dbasis[1*numnodes+i]+(w-wm)*dbasis[2*numnodes+i])* 477 ((u-um)*dbasis[0*numnodes+j]+(v-vm)*dbasis[1*numnodes+j]+(w-wm)*dbasis[2*numnodes+j]); 476 478 } 477 479 } … … 482 484 Ke->values[i*numnodes+j]+=tau_parameter*D_scalar*basis[j]*((u-um)*dbasis[0*numnodes+i]+(v-vm)*dbasis[1*numnodes+i]+(w-wm)*dbasis[2*numnodes+i]); 483 485 } 486 } 487 } 488 } 489 /*anisotropic SUPG*/ 490 else if(stabilization==3){ 491 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss); 492 element->ElementSizes(&hx,&hy,&hz); 493 element->StabilizationParameterAnisotropic(&tau_parameter_anisotropic[0],u-um,v-vm,w-wm,hx,hy,hz,kappa); 494 tau_parameter_hor=tau_parameter_anisotropic[0]; 495 tau_parameter_ver=tau_parameter_anisotropic[1]; 496 for(int i=0;i<numnodes;i++){ 497 for(int j=0;j<numnodes;j++){ 498 Ke->values[i*numnodes+j]+=D_scalar* 499 (sqrt(tau_parameter_hor)*(u-um)*dbasis[0*numnodes+i]+sqrt(tau_parameter_hor)*(v-vm)*dbasis[1*numnodes+i]+sqrt(tau_parameter_ver)*(w-wm)*dbasis[2*numnodes+i])* 500 (sqrt(tau_parameter_hor)*(u-um)*dbasis[0*numnodes+j]+sqrt(tau_parameter_hor)*(v-vm)*dbasis[1*numnodes+j]+sqrt(tau_parameter_ver)*(w-wm)*dbasis[2*numnodes+j]); 484 501 } 485 502 } … … 635 652 IssmDouble Jdet,phi,dt; 636 653 IssmDouble temperature; 637 IssmDouble tau_parameter,diameter; 654 IssmDouble tau_parameter,diameter,hx,hy,hz; 655 IssmDouble tau_parameter_anisotropic[2],tau_parameter_hor,tau_parameter_ver; 638 656 IssmDouble u,v,w; 639 657 IssmDouble scalar_def,scalar_transient; … … 661 679 Input* temperature_input = NULL; 662 680 if(reCast<bool,IssmDouble>(dt)){temperature_input = element->GetInput(TemperatureEnum); _assert_(temperature_input);} 663 if(stabilization==2) diameter=element->MinEdgeLength(xyz_list);664 681 665 682 /* Start looping on the number of gaussian points: */ … … 686 703 if(stabilization==2){ 687 704 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss); 688 705 diameter=element->MinEdgeLength(xyz_list); 689 706 vx_input->GetInputValue(&u,gauss); 690 707 vy_input->GetInputValue(&v,gauss); … … 697 714 for(int i=0;i<numnodes;i++) pe->values[i]+=tau_parameter*scalar_transient*(u*dbasis[0*numnodes+i]+v*dbasis[1*numnodes+i]+w*dbasis[2*numnodes+i]); 698 715 } 716 } 717 /* anisotropic SUPG */ 718 else if(stabilization==3){ 719 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss); 720 element->ElementSizes(&hx,&hy,&hz); 721 vx_input->GetInputValue(&u,gauss); 722 vy_input->GetInputValue(&v,gauss); 723 vz_input->GetInputValue(&w,gauss); 724 element->StabilizationParameterAnisotropic(&tau_parameter_anisotropic[0],u,v,w,hx,hy,hz,kappa); 725 tau_parameter_hor=tau_parameter_anisotropic[0]; 726 tau_parameter_ver=tau_parameter_anisotropic[1]; 727 728 for(int i=0;i<numnodes;i++) pe->values[i]+=scalar_def*(tau_parameter_hor*u*dbasis[0*numnodes+i]+tau_parameter_hor*v*dbasis[1*numnodes+i]+tau_parameter_ver*w*dbasis[2*numnodes+i]); 699 729 } 700 730 } -
TabularUnified issm/trunk-jpl/src/c/classes/Elements/Element.h ¶
r24089 r24136 319 319 virtual Element* SpawnTopElement(void)=0; 320 320 virtual IssmDouble StabilizationParameter(IssmDouble u, IssmDouble v, IssmDouble w, IssmDouble diameter, IssmDouble kappa)=0; 321 virtual IssmDouble StabilizationParameterAnisotropic(IssmDouble* tau_parameter_anisotropic, IssmDouble u, IssmDouble v, IssmDouble w, IssmDouble hx, IssmDouble hy, IssmDouble hz, IssmDouble kappa)=0; 321 322 virtual void StrainRateparallel(void)=0; 322 323 virtual void StrainRateperpendicular(void)=0; -
TabularUnified issm/trunk-jpl/src/c/classes/Elements/Penta.cpp ¶
r24119 r24136 3142 3142 IssmDouble Penta::StabilizationParameter(IssmDouble u, IssmDouble v, IssmDouble w, IssmDouble diameter, IssmDouble kappa){/*{{{*/ 3143 3143 /*Compute stabilization parameter*/ 3144 /*kappa=thermalconductivity/(rho_ice*hea rcapacity) for thermal model*/3144 /*kappa=thermalconductivity/(rho_ice*heatcapacity) for thermal model*/ 3145 3145 /*kappa=enthalpydiffusionparameter for enthalpy model*/ 3146 3146 … … 3155 3155 3156 3156 return tau_parameter; 3157 } 3158 IssmDouble Penta::StabilizationParameterAnisotropic(IssmDouble* tau_parameter_anisotropic, IssmDouble u, IssmDouble v, IssmDouble w, IssmDouble hx, IssmDouble hy, IssmDouble hz, IssmDouble kappa){/*{{{*/ 3159 /*Compute stabilization parameter*/ 3160 /*kappa=thermalconductivity/(rho_ice*heatcapacity) for thermal model*/ 3161 /*kappa=enthalpydiffusionparameter for enthalpy model*/ 3162 3163 IssmDouble normu,hk,C,area,p; 3164 3165 /* compute tau for the horizontal direction */ 3166 p=2.; C=3.; 3167 normu=pow(pow(u,p)+pow(v,p)+pow(w,p),1./p); 3168 hk=sqrt(pow(hx,2)+pow(hy,2)); 3169 3170 if(normu*hk/(C*2*kappa)<1){ 3171 tau_parameter_anisotropic[0]=pow(hk,2)/(C*2*2*kappa); 3172 } 3173 else tau_parameter_anisotropic[0]=hk/(2*normu); 3174 3175 /* compute tau for the vertical direction */ 3176 hk=hz; 3177 if(normu*hk/(C*2*kappa)<1){ 3178 tau_parameter_anisotropic[1]=pow(hk,2)/(C*2*2*kappa); 3179 } 3180 else tau_parameter_anisotropic[1]=hk/(2*normu); 3157 3181 } 3158 3182 /*}}}*/ -
TabularUnified issm/trunk-jpl/src/c/classes/Elements/Penta.h ¶
r24119 r24136 162 162 Tria* SpawnTria(int index1,int index2,int index3); 163 163 IssmDouble StabilizationParameter(IssmDouble u, IssmDouble v, IssmDouble w, IssmDouble diameter, IssmDouble kappa); 164 IssmDouble StabilizationParameterAnisotropic(IssmDouble* tau_parameter_anisotropic, IssmDouble u, IssmDouble v, IssmDouble w, IssmDouble hx, IssmDouble hy, IssmDouble hz, IssmDouble kappa); 164 165 void StressIntensityFactor(); 165 166 void StrainRateparallel(); -
TabularUnified issm/trunk-jpl/src/c/classes/Elements/Seg.h ¶
r24089 r24136 138 138 Element* SpawnTopElement(void){_error_("not implemented yet");}; 139 139 IssmDouble StabilizationParameter(IssmDouble u, IssmDouble v, IssmDouble w, IssmDouble diameter, IssmDouble kappa){_error_("not implemented yet");}; 140 IssmDouble StabilizationParameterAnisotropic(IssmDouble* tau_parameter_anisotropic, IssmDouble u, IssmDouble v, IssmDouble w, IssmDouble hx, IssmDouble hy, IssmDouble hz, IssmDouble kappa){_error_("not implemented yet");}; 140 141 void StrainRateparallel(void){_error_("not implemented yet");}; 141 142 void StrainRateperpendicular(void){_error_("not implemented yet");}; -
TabularUnified issm/trunk-jpl/src/c/classes/Elements/Tetra.h ¶
r24089 r24136 147 147 Tria* SpawnTria(int index1,int index2,int index3); 148 148 IssmDouble StabilizationParameter(IssmDouble u, IssmDouble v, IssmDouble w, IssmDouble diameter, IssmDouble kappa){_error_("not implemented yet");}; 149 IssmDouble StabilizationParameterAnisotropic(IssmDouble* tau_parameter_anisotropic, IssmDouble u, IssmDouble v, IssmDouble w, IssmDouble hx, IssmDouble hy, IssmDouble hz, IssmDouble kappa){_error_("not implemented yet");}; 149 150 void StrainRateparallel(void){_error_("not implemented yet");}; 150 151 void StrainRateperpendicular(void){_error_("not implemented yet");}; -
TabularUnified issm/trunk-jpl/src/c/classes/Elements/Tria.h ¶
r24089 r24136 215 215 Seg* SpawnSeg(int index1,int index2); 216 216 IssmDouble StabilizationParameter(IssmDouble u, IssmDouble v, IssmDouble w, IssmDouble diameter, IssmDouble kappa){_error_("not implemented yet");}; 217 IssmDouble StabilizationParameterAnisotropic(IssmDouble* tau_parameter_ansiotropic, IssmDouble u, IssmDouble v, IssmDouble w, IssmDouble hx, IssmDouble hy, IssmDouble hz, IssmDouble kappa){_error_("not implemented yet");}; 217 218 void UpdateConstraintsExtrudeFromBase(void); 218 219 void UpdateConstraintsExtrudeFromTop(void); -
TabularUnified issm/trunk-jpl/src/m/classes/thermal.js ¶
r22677 r24136 41 41 42 42 fielddisplay(this,'spctemperature','temperature constraints (NaN means no constraint) [K]'); 43 fielddisplay(this,'stabilization','0: no, 1: artificial_diffusivity, 2: SUPG ');43 fielddisplay(this,'stabilization','0: no, 1: artificial_diffusivity, 2: SUPG, 3: anisotropic SUPG'); 44 44 fielddisplay(this,'reltol','relative tolerance convergence criterion for enthalpy'); 45 45 fielddisplay(this,'maxiter','maximum number of non linear iterations'); … … 90 90 if(!ArrayAnyEqual(ArrayIsMember('ThermalAnalysis',analyses),1) & !ArrayAnyEqual(ArrayIsMember('EnthalpyAnalysis',analyses),1) | (solution == 'TransientSolution' & md.trans.isthermal==0)) return; 91 91 92 checkfield(md,'fieldname','thermal.stabilization','numel',[1],'values',[0 ,1, 2 ]);92 checkfield(md,'fieldname','thermal.stabilization','numel',[1],'values',[0 ,1, 2, 3]); 93 93 checkfield(md,'fieldname','thermal.spctemperature','Inf',1,'timeseries',1); 94 94 checkfield(md,'fieldname','thermal.fe','values',['P1','P1xP2','P1xP3']); -
TabularUnified issm/trunk-jpl/src/m/classes/thermal.m ¶
r21670 r24136 78 78 if (~ismember('ThermalAnalysis',analyses) & ~ismember('EnthalpyAnalysis',analyses)) | (strcmp(solution,'TransientSolution') & md.transient.isthermal==0), return; end 79 79 80 md = checkfield(md,'fieldname','thermal.stabilization','numel',[1],'values',[0 1 2 ]);80 md = checkfield(md,'fieldname','thermal.stabilization','numel',[1],'values',[0 1 2 3]); 81 81 md = checkfield(md,'fieldname','thermal.spctemperature','Inf',1,'timeseries',1,'>=',0); 82 82 md = checkfield(md,'fieldname','thermal.fe','values',{'P1','P1xP2','P1xP3'}); … … 107 107 108 108 fielddisplay(self,'spctemperature','temperature constraints (NaN means no constraint) [K]'); 109 fielddisplay(self,'stabilization','0: no, 1: artificial_diffusivity, 2: SUPG ');109 fielddisplay(self,'stabilization','0: no, 1: artificial_diffusivity, 2: SUPG, 3: anisotropic SUPG'); 110 110 fielddisplay(self,'reltol','relative tolerance convergence criterion for enthalpy'); 111 111 fielddisplay(self,'maxiter','maximum number of non linear iterations'); -
TabularUnified issm/trunk-jpl/src/m/classes/thermal.py ¶
r23170 r24136 33 33 string=' Thermal solution parameters:' 34 34 string="%s\n%s"%(string,fielddisplay(self,'spctemperature','temperature constraints (NaN means no constraint) [K]')) 35 string="%s\n%s"%(string,fielddisplay(self,'stabilization','0: no, 1: artificial_diffusivity, 2: SUPG '))35 string="%s\n%s"%(string,fielddisplay(self,'stabilization','0: no, 1: artificial_diffusivity, 2: SUPG, 3: anisotropic SUPG')) 36 36 string="%s\n%s"%(string,fielddisplay(self,'maxiter','maximum number of non linear iterations')) 37 37 string="%s\n%s"%(string,fielddisplay(self,'reltol','relative tolerance criterion')) … … 96 96 return md 97 97 98 md = checkfield(md,'fieldname','thermal.stabilization','numel',[1],'values',[0,1,2 ])98 md = checkfield(md,'fieldname','thermal.stabilization','numel',[1],'values',[0,1,2,3]) 99 99 md = checkfield(md,'fieldname','thermal.spctemperature','Inf',1,'timeseries',1) 100 100 md = checkfield(md,'fieldname','thermal.requested_outputs','stringrow',1)
Note:
See TracChangeset
for help on using the changeset viewer.