Changeset 19002
- Timestamp:
- 01/09/15 08:48:50 (10 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp
r18930 r19002 26 26 27 27 /*Finite Element Analysis*/ 28 void 28 void AdjointHorizAnalysis::Core(FemModel* femmodel){/*{{{*/ 29 29 _error_("not implemented"); 30 30 }/*}}}*/ … … 1074 1074 /*Check that control_type is supported*/ 1075 1075 if(control_type!=MaterialsRheologyBbarEnum && 1076 control_type!=FrictionCoefficientEnum && 1076 control_type!=FrictionCoefficientEnum && 1077 control_type!=FrictionAsEnum && 1077 1078 control_type!=DamageDbarEnum && 1078 1079 control_type!=MaterialsRheologyBEnum){ … … 1101 1102 case HOApproximationEnum: GradientJDragHO( element,gradient,control_index); break; 1102 1103 case FSApproximationEnum: GradientJDragFS( element,gradient,control_index); break; 1104 case NoneApproximationEnum: /*Gradient is 0*/ break; 1105 default: _error_("approximation " << EnumToStringx(approximation) << " not supported yet"); 1106 } 1107 break; 1108 case FrictionAsEnum: 1109 switch(approximation){ 1110 case SSAApproximationEnum: GradientJDragHydroSSA(element,gradient,control_index); break; 1111 case L1L2ApproximationEnum:GradientJDragHydroL1L2(element,gradient,control_index); break; 1112 case HOApproximationEnum: GradientJDragHydroHO( element,gradient,control_index); break; 1113 case FSApproximationEnum: GradientJDragHydroFS( element,gradient,control_index); break; 1103 1114 case NoneApproximationEnum: /*Gradient is 0*/ break; 1104 1115 default: _error_("approximation " << EnumToStringx(approximation) << " not supported yet"); … … 1886 1897 if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;}; 1887 1898 }/*}}}*/ 1899 1900 void AdjointHorizAnalysis::GradientJDragHydroFS(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/ 1901 1902 /*return if floating or not on bed (gradient is 0)*/ 1903 if(element->IsFloating()) return; 1904 if(!element->IsOnBase()) return; 1905 1906 /*Intermediaries*/ 1907 int domaintype,dim; 1908 IssmDouble Jdet,weight; 1909 IssmDouble drag,dalpha2dk,normal[3]; 1910 IssmDouble vx,vy,vz,lambda,mu,xi; 1911 IssmDouble *xyz_list_base= NULL; 1912 1913 /*Fetch number of vertices for this finite element*/ 1914 int numvertices = element->GetNumberOfVertices(); 1915 1916 /*Initialize some vectors*/ 1917 IssmDouble* basis = xNew<IssmDouble>(numvertices); 1918 IssmDouble* ge = xNewZeroInit<IssmDouble>(numvertices); 1919 int* vertexpidlist = xNew<int>(numvertices); 1920 1921 /* get domaintype */ 1922 element->FindParam(&domaintype,DomainTypeEnum); 1923 1924 /*Build friction element, needed later: */ 1925 if(domaintype!=Domain2DverticalEnum) dim=3; 1926 else dim=2; 1927 Friction* friction=new Friction(element,dim); 1928 1929 /*Retrieve all inputs we will be needing: */ 1930 element->GetVerticesCoordinatesBase(&xyz_list_base); 1931 element->GradientIndexing(&vertexpidlist[0],control_index); 1932 Input* vx_input = element->GetInput(VxEnum); _assert_(vx_input); 1933 Input* vy_input = element->GetInput(VyEnum); _assert_(vy_input); 1934 Input* adjointx_input = element->GetInput(AdjointxEnum); _assert_(adjointx_input); 1935 Input* adjointy_input = element->GetInput(AdjointyEnum); _assert_(adjointy_input); 1936 Input* vz_input = NULL; 1937 Input* adjointz_input = NULL; 1938 if(domaintype!=Domain2DverticalEnum){ 1939 vz_input = element->GetInput(VzEnum); _assert_(vy_input); 1940 adjointz_input = element->GetInput(AdjointzEnum); _assert_(adjointz_input); 1941 } 1942 1943 /* Start looping on the number of gaussian points: */ 1944 Gauss* gauss=element->NewGaussBase(4); 1945 for(int ig=gauss->begin();ig<gauss->end();ig++){ 1946 gauss->GaussPoint(ig); 1947 1948 adjointx_input->GetInputValue(&lambda, gauss); 1949 adjointy_input->GetInputValue(&mu, gauss); 1950 vx_input->GetInputValue(&vx,gauss); 1951 vy_input->GetInputValue(&vy,gauss); 1952 if(domaintype!=Domain2DverticalEnum){ 1953 adjointz_input->GetInputValue(&xi ,gauss); 1954 vz_input->GetInputValue(&vz,gauss); 1955 } 1956 1957 friction->GetAlphaComplement(&dalpha2dk,gauss); 1958 element->NormalBase(&normal[0],xyz_list_base); 1959 1960 element->JacobianDeterminantBase(&Jdet,xyz_list_base,gauss); 1961 element->NodalFunctionsP1(basis,gauss); 1962 1963 /*Build gradient vector (actually -dJ/dk): */ 1964 if(domaintype!=Domain2DverticalEnum){ 1965 for(int i=0;i<numvertices;i++){ 1966 ge[i]+=( 1967 -lambda*(dalpha2dk*(vx - vz*normal[0]*normal[2])) 1968 -mu *(dalpha2dk*(vy - vz*normal[1]*normal[2])) 1969 -xi *(dalpha2dk*(-vx*normal[0]*normal[2]-vy*normal[1]*normal[2])) 1970 )*Jdet*gauss->weight*basis[i]; 1971 _assert_(!xIsNan<IssmDouble>(ge[i])); 1972 } 1973 } 1974 else{ 1975 for(int i=0;i<numvertices;i++){ 1976 ge[i]+=( 1977 -lambda*dalpha2dk*vx 1978 -mu *dalpha2dk*vy 1979 )*Jdet*gauss->weight*basis[i]; 1980 _assert_(!xIsNan<IssmDouble>(ge[i])); 1981 } 1982 } 1983 } 1984 gradient->SetValues(numvertices,vertexpidlist,ge,ADD_VAL); 1985 1986 /*Clean up and return*/ 1987 xDelete<IssmDouble>(xyz_list_base); 1988 xDelete<IssmDouble>(basis); 1989 xDelete<IssmDouble>(ge); 1990 xDelete<int>(vertexpidlist); 1991 delete gauss; 1992 delete friction; 1993 }/*}}}*/ 1994 void AdjointHorizAnalysis::GradientJDragHydroL1L2(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/ 1995 1996 /*Same as SSA*/ 1997 return this->GradientJDragSSA(element,gradient,control_index); 1998 }/*}}}*/ 1999 void AdjointHorizAnalysis::GradientJDragHydroHO(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/ 2000 2001 /*return if floating or not on bed (gradient is 0)*/ 2002 if(element->IsFloating()) return; 2003 if(!element->IsOnBase()) return; 2004 2005 /*Intermediaries*/ 2006 IssmDouble Jdet,weight; 2007 IssmDouble drag,dalpha2dk; 2008 IssmDouble vx,vy,lambda,mu; 2009 IssmDouble *xyz_list_base= NULL; 2010 2011 int domaintype,dim; 2012 element->FindParam(&domaintype,DomainTypeEnum); 2013 /*Fetch number of vertices for this finite element*/ 2014 int numvertices = element->GetNumberOfVertices(); 2015 2016 /*Initialize some vectors*/ 2017 IssmDouble* basis = xNew<IssmDouble>(numvertices); 2018 IssmDouble* ge = xNewZeroInit<IssmDouble>(numvertices); 2019 int* vertexpidlist = xNew<int>(numvertices); 2020 2021 /*Build friction element, needed later: */ 2022 if(domaintype!=Domain2DverticalEnum) dim=3; 2023 else dim=2; 2024 Friction* friction=new Friction(element,dim); 2025 2026 /*Retrieve all inputs we will be needing: */ 2027 element->GetVerticesCoordinatesBase(&xyz_list_base); 2028 element->GradientIndexing(&vertexpidlist[0],control_index); 2029 Input* vx_input = element->GetInput(VxEnum); _assert_(vx_input); 2030 Input* vy_input = NULL; 2031 Input* adjointx_input = element->GetInput(AdjointxEnum); _assert_(adjointx_input); 2032 Input* adjointy_input = NULL; 2033 if(domaintype!=Domain2DverticalEnum){ 2034 vy_input = element->GetInput(VyEnum); _assert_(vy_input); 2035 adjointy_input = element->GetInput(AdjointyEnum); _assert_(adjointy_input); 2036 } 2037 /* Start looping on the number of gaussian points: */ 2038 Gauss* gauss=element->NewGaussBase(4); 2039 for(int ig=gauss->begin();ig<gauss->end();ig++){ 2040 gauss->GaussPoint(ig); 2041 2042 adjointx_input->GetInputValue(&lambda, gauss); 2043 vx_input->GetInputValue(&vx,gauss); 2044 if(domaintype!=Domain2DverticalEnum){ 2045 adjointy_input->GetInputValue(&mu, gauss); 2046 vy_input->GetInputValue(&vy,gauss); 2047 } 2048 2049 friction->GetAlphaComplement(&dalpha2dk,gauss); 2050 2051 element->JacobianDeterminantBase(&Jdet,xyz_list_base,gauss); 2052 element->NodalFunctionsP1(basis,gauss); 2053 2054 /*Build gradient vector (actually -dJ/dD): */ 2055 for(int i=0;i<numvertices;i++){ 2056 if(domaintype!=Domain2DverticalEnum) ge[i]+=-dalpha2dk*((lambda*vx+mu*vy))*Jdet*gauss->weight*basis[i]; 2057 else ge[i]+=-dalpha2dk*(lambda*vx)*Jdet*gauss->weight*basis[i]; 2058 _assert_(!xIsNan<IssmDouble>(ge[i])); 2059 } 2060 } 2061 gradient->SetValues(numvertices,vertexpidlist,ge,ADD_VAL); 2062 2063 /*Clean up and return*/ 2064 xDelete<IssmDouble>(xyz_list_base); 2065 xDelete<IssmDouble>(basis); 2066 xDelete<IssmDouble>(ge); 2067 xDelete<int>(vertexpidlist); 2068 delete gauss; 2069 delete friction; 2070 }/*}}}*/ 2071 2072 void AdjointHorizAnalysis::GradientJDragHydroSSA(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/ 2073 2074 /*return if floating (gradient is 0)*/ 2075 if(element->IsFloating()) return; 2076 2077 /*Intermediaries*/ 2078 int domaintype,dim; 2079 Element* basalelement; 2080 2081 /*Get basal element*/ 2082 element->FindParam(&domaintype,DomainTypeEnum); 2083 switch(domaintype){ 2084 case Domain2DhorizontalEnum: 2085 basalelement = element; 2086 dim = 2; 2087 break; 2088 case Domain2DverticalEnum: 2089 if(!element->IsOnBase()) return; 2090 basalelement = element->SpawnBasalElement(); 2091 dim = 1; 2092 break; 2093 case Domain3DEnum: 2094 if(!element->IsOnBase()) return; 2095 basalelement = element->SpawnBasalElement(); 2096 dim = 2; 2097 break; 2098 default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet"); 2099 } 2100 2101 /*Intermediaries*/ 2102 IssmDouble Jdet,weight; 2103 IssmDouble dalpha2dk; 2104 IssmDouble vx,vy,lambda,mu; 2105 IssmDouble *xyz_list= NULL; 2106 2107 2108 /*Fetch number of vertices for this finite element*/ 2109 int numvertices = basalelement->GetNumberOfVertices(); 2110 2111 /*Initialize some vectors*/ 2112 IssmDouble* basis = xNew<IssmDouble>(numvertices); 2113 IssmDouble* ge = xNewZeroInit<IssmDouble>(numvertices); 2114 int* vertexpidlist = xNew<int>(numvertices); 2115 2116 /*Build friction element, needed later: */ 2117 Friction* friction=new Friction(basalelement,dim); 2118 2119 /*Retrieve all inputs we will be needing: */ 2120 basalelement->GetVerticesCoordinates(&xyz_list); 2121 basalelement->GradientIndexing(&vertexpidlist[0],control_index); 2122 Input* vx_input = basalelement->GetInput(VxEnum); _assert_(vx_input); 2123 Input* vy_input = basalelement->GetInput(VyEnum); _assert_(vy_input); 2124 Input* adjointx_input = basalelement->GetInput(AdjointxEnum); _assert_(adjointx_input); 2125 Input* adjointy_input = basalelement->GetInput(AdjointyEnum); _assert_(adjointy_input); 2126 2127 2128 2129 IssmDouble q_exp; 2130 IssmDouble C_param; 2131 IssmDouble As; 2132 IssmDouble Neff; 2133 IssmDouble n; 2134 IssmDouble alpha; 2135 IssmDouble Chi,Gamma; 2136 IssmDouble vz,vmag; 2137 IssmDouble Uder; 2138 2139 /*Recover parameters: */ 2140 Input* qinput = basalelement->GetInput(FrictionQEnum); 2141 Input* cinput = basalelement->GetInput(FrictionCEnum); 2142 Input* Asinput = basalelement->GetInput(FrictionAsEnum); 2143 Input* Ninput = basalelement->GetInput(FrictionEffectivePressureEnum); 2144 Input* nInput =basalelement->GetInput(MaterialsRheologyNEnum); 2145 2146 /* Start looping on the number of gaussian points: */ 2147 Gauss* gauss=basalelement->NewGauss(4); 2148 for(int ig=gauss->begin();ig<gauss->end();ig++){ 2149 gauss->GaussPoint(ig); 2150 2151 adjointx_input->GetInputValue(&lambda, gauss); 2152 adjointy_input->GetInputValue(&mu, gauss); 2153 vx_input->GetInputValue(&vx,gauss); 2154 vy_input->GetInputValue(&vy,gauss); 2155 2156 friction->GetAlphaComplement(&dalpha2dk,gauss); 2157 2158 basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss); 2159 basalelement->NodalFunctionsP1(basis,gauss); 2160 2161 /*Dealing with dalpha/du*/ 2162 qinput->GetInputValue(&q_exp,gauss); 2163 cinput->GetInputValue(&C_param,gauss); 2164 Asinput->GetInputValue(&As,gauss); 2165 Ninput->GetInputValue(&Neff,gauss); 2166 nInput->GetInputValue(&n,gauss); 2167 2168 if (q_exp==1){ 2169 alpha=1; 2170 } 2171 else{ 2172 alpha=(pow(q_exp-1,q_exp-1))/pow(q_exp,q_exp); 2173 } 2174 Chi = vmag/(pow(C_param,n)*pow(Neff,n)*As); 2175 Gamma = (Chi/(1.+alpha*pow(Chi,q_exp))); 2176 2177 Uder =Neff*C_param/(vmag*vmag*n) * 2178 (Gamma-alpha*q_exp*pow(Chi,q_exp-1.)*Gamma*Gamma* pow(Gamma,(1.-n)/n) - 2179 n* pow(Gamma,1./n)); 2180 2181 /*Build gradient vector (actually -dJ/dD): */ 2182 for(int i=0;i<numvertices;i++){ 2183 ge[i]+=-dalpha2dk*((lambda*vx+mu*vy))*Jdet*gauss->weight*basis[i]; 2184 _assert_(!xIsNan<IssmDouble>(ge[i])); 2185 } 2186 } 2187 gradient->SetValues(numvertices,vertexpidlist,ge,ADD_VAL); 2188 2189 /*Clean up and return*/ 2190 xDelete<IssmDouble>(xyz_list); 2191 xDelete<IssmDouble>(basis); 2192 xDelete<IssmDouble>(ge); 2193 xDelete<int>(vertexpidlist); 2194 delete gauss; 2195 delete friction; 2196 if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;}; 2197 }/*}}}*/ 2198 1888 2199 void AdjointHorizAnalysis::GradientJDSSA(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/ 1889 2200 -
issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.h
r18930 r19002 50 50 void GradientJDragHO(Element* element,Vector<IssmDouble>* gradient,int control_index); 51 51 void GradientJDragSSA(Element* element,Vector<IssmDouble>* gradient,int control_index); 52 void GradientJDragHydroFS(Element* element,Vector<IssmDouble>* gradient,int control_index); 53 void GradientJDragHydroL1L2(Element* element,Vector<IssmDouble>* gradient,int control_index); 54 void GradientJDragHydroHO(Element* element,Vector<IssmDouble>* gradient,int control_index); 55 void GradientJDragHydroSSA(Element* element,Vector<IssmDouble>* gradient,int control_index); 52 56 void GradientJDSSA(Element* element,Vector<IssmDouble>* gradient,int control_index); 53 57 void InputUpdateFromSolution(IssmDouble* solution,Element* element); -
issm/trunk-jpl/src/c/classes/Elements/Element.cpp
r18959 r19002 1148 1148 name==WatercolumnEnum || 1149 1149 name==FrictionCoefficientEnum || 1150 name==FrictionAsEnum || 1150 1151 name==MaskGroundediceLevelsetEnum || 1151 1152 name==MaskIceLevelsetEnum || -
issm/trunk-jpl/src/c/classes/Elements/Penta.cpp
r18968 r19002 1574 1574 case ThicknessEnum: 1575 1575 case FrictionCoefficientEnum: 1576 case FrictionAsEnum: 1576 1577 case MaterialsRheologyBEnum: 1577 1578 if(iomodel->Data(control)){ -
issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
r18976 r19002 1774 1774 case BalancethicknessOmegaEnum: 1775 1775 case FrictionCoefficientEnum: 1776 case MaterialsRheologyBEnum: 1776 case FrictionAsEnum: 1777 case MaterialsRheologyBEnum: 1777 1778 if(iomodel->Data(control)){ 1778 1779 for(j=0;j<NUMVERTICES;j++)nodeinputs[j]=iomodel->Data(control)[tria_vertex_ids[j]-1]; -
issm/trunk-jpl/src/c/classes/Inputs/TriaInput.h
r18450 r19002 49 49 void GetInputValue(bool* pvalue){_error_("not implemented yet");} 50 50 void GetInputValue(int* pvalue){_error_("not implemented yet");} 51 void GetInputValue(IssmDouble* pvalue){_error_("not implemented yet ");}51 void GetInputValue(IssmDouble* pvalue){_error_("not implemented yet (Input is "<<EnumToStringx(this->enum_type)<<")");}//{_error_("not implemented yet");} 52 52 void GetInputValue(IssmDouble* pvalue,Gauss* gauss); 53 53 void GetInputValue(IssmDouble* pvalue,Gauss* gauss,IssmDouble time){_error_("not implemented yet");}; -
issm/trunk-jpl/src/c/classes/Loads/Friction.cpp
r18992 r19002 126 126 IssmDouble n; 127 127 IssmDouble alpha; 128 IssmDouble Chi ;128 IssmDouble Chi,Gamma; 129 129 IssmDouble vx,vy,vz,vmag; 130 130 IssmDouble alpha_complement; … … 133 133 element->GetInputValue(&q_exp,FrictionQEnum); 134 134 element->GetInputValue(&C_param,FrictionCEnum); 135 element->GetInputValue(&As,FrictionAsEnum); 136 135 136 element->GetInputValue(&As,gauss,FrictionAsEnum); 137 137 element->GetInputValue(&Neff,gauss,FrictionEffectivePressureEnum); 138 138 element->GetInputValue(&n,gauss,MaterialsRheologyNEnum); … … 160 160 _error_("not supported"); 161 161 } 162 // vmag=100./(3600.*24.*365.); 163 162 164 if (q_exp==1){ 163 165 alpha=1; … … 166 168 alpha=(pow(q_exp-1,q_exp-1))/pow(q_exp,q_exp); 167 169 } 168 Chi =vmag/(pow(C_param,n)*pow(Neff,n)*As);169 170 Chi = vmag/(pow(C_param,n)*pow(Neff,n)*As); 171 Gamma = (Chi/(1.+alpha*pow(Chi,q_exp))); 170 172 /*Check to prevent dividing by zero if vmag==0*/ 171 173 if(vmag==0.) alpha_complement=0.; 172 else if(Neff==0.) alpha_complement=0.; 173 else alpha_complement=-(C_param*Neff/(vmag*n)) * pow((Chi/(alpha*pow(Chi,q_exp)+1)),((1-n)/n)) *(Chi/(As*(alpha*pow(Chi,q_exp)+1)))-(alpha*q_exp*pow(Chi,q_exp+1)/(As*(alpha*pow(Chi,q_exp)+1))); 174 else if(Neff==0.) alpha_complement=0.; 175 else alpha_complement=-(C_param*Neff/(n*vmag)) * 176 pow(Gamma,((1.-n)/n)) * 177 (Gamma/As - (alpha*q_exp*pow(Chi,q_exp-1.)* Gamma * Gamma/As)); 178 174 179 _assert_(!xIsNan<IssmDouble>(alpha_complement)); 175 180 /*Assign output pointers:*/ … … 221 226 222 227 IssmDouble alpha; 223 IssmDouble Chi ;228 IssmDouble Chi,Gamma; 224 229 225 230 IssmDouble vx,vy,vz,vmag; … … 229 234 element->GetInputValue(&q_exp,FrictionQEnum); 230 235 element->GetInputValue(&C_param,FrictionCEnum); 231 element->GetInputValue(&As, FrictionAsEnum);236 element->GetInputValue(&As,gauss,FrictionAsEnum); 232 237 233 238 element->GetInputValue(&Neff,gauss,FrictionEffectivePressureEnum); … … 256 261 } 257 262 263 // vmag=100./(3600.*24.*365.); 258 264 //compute alpha and Chi coefficients: */ 259 265 if (q_exp==1){ … … 264 270 } 265 271 Chi=vmag/(pow(C_param,n)*pow(Neff,n)*As); 266 267 /*Check to prevent dividing by zero if vmag==0*/ 268 if(vmag==0.) alpha2=0.; 269 else if (Neff==0) alpha2=0.0; 270 else alpha2= Neff * C_param * pow((Chi/(1 + alpha * pow(Chi,q_exp))),1/n) * 1/vmag; 272 Gamma=(Chi/(1. + alpha * pow(Chi,q_exp))); 273 /*Check to prevent dividing by zero if vmag==0*/ 274 if(vmag==0.) alpha2=0.; 275 else if (Neff==0) alpha2=0.0; 276 else alpha2=Neff * C_param * pow(Gamma,1./n) * 1/vmag; 277 271 278 _assert_(!xIsNan<IssmDouble>(alpha2)); 272 279 /*Assign output pointers:*/ -
issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp
r18830 r19002 48 48 switch(control){ 49 49 /*List of supported controls*/ 50 50 case BalancethicknessThickeningRateEnum: 51 51 case VxEnum: 52 52 case VyEnum: 53 53 case ThicknessEnum: 54 case FrictionCoefficientEnum: 55 case BalancethicknessApparentMassbalanceEnum: 54 case FrictionCoefficientEnum: 55 case FrictionAsEnum: 56 case BalancethicknessApparentMassbalanceEnum: 56 57 case BalancethicknessOmegaEnum: 57 58 case MaterialsRheologyBEnum:
Note:
See TracChangeset
for help on using the changeset viewer.