@@ -284,6 +284,98 @@ def _pde_jax(self, nn_input_var, nn_output_var): #{{{
284284 return [f1 , f2 ] #}}}
285285 #}}}
286286#}}}
287+ # SSA first order {{{
288+ class SSAFirstEquationParameter (EquationParameter , Constants ):
289+ """ default parameters for SSA first order form
290+ """
291+ _EQUATION_TYPE = 'SSA First'
292+ def __init__ (self , param_dict = {}):
293+ # load necessary constants
294+ Constants .__init__ (self )
295+ super ().__init__ (param_dict )
296+
297+ def set_default (self ):
298+ self .input = ['x' , 'y' ]
299+ self .output = ['u' , 'v' , 's' , 'H' , 'taub' , 'B11' , 'B12' , 'B22' ]
300+ self .output_lb = [self .variable_lb [k ] for k in self .output ]
301+ self .output_ub = [self .variable_ub [k ] for k in self .output ]
302+ self .data_weights = [1.0e-8 * self .yts ** 2.0 , 1.0e-8 * self .yts ** 2.0 , 1.0e-6 , 1.0e-6 , 1.0e-10 , 0.0 , 0.0 , 0.0 ]
303+ self .residuals = ["f" + self ._EQUATION_TYPE + "1" , "f" + self ._EQUATION_TYPE + "2" , "dB11" , "dB12" , "dB22" ]
304+ self .pde_weights = [1.0e-10 , 1.0e-10 , 1e-10 , 1e-10 , 1e-10 ]
305+
306+ # scalar variables: name:value
307+ self .scalar_variables = {
308+ 'n' : 3.0 , # exponent of Glen's flow law
309+ 'B' :1.26802073401e+08 # -8 degree C, cuffey
310+ }
311+ class SSA_First (EquationBase ): #{{{
312+ """ SSA on 2D problem with uniform B, no friction law, but use taub
313+ """
314+ _EQUATION_TYPE = 'SSA First'
315+ def __init__ (self , parameters = SSATauEquationParameter ()):
316+ super ().__init__ (parameters )
317+ def _pde (self , nn_input_var , nn_output_var ): #{{{
318+ """ residual of SSA 2D PDEs
319+
320+ Args:
321+ nn_input_var: global input to the nn
322+ nn_output_var: global output from the nn
323+ """
324+ # get the ids
325+ xid = self .local_input_var ["x" ]
326+ yid = self .local_input_var ["y" ]
327+
328+ uid = self .local_output_var ["u" ]
329+ vid = self .local_output_var ["v" ]
330+ sid = self .local_output_var ["s" ]
331+ Hid = self .local_output_var ["H" ]
332+ tauid = self .local_output_var ["taub" ]
333+ B11id = self .local_output_var ["B11" ]
334+ B12id = self .local_output_var ["B12" ]
335+ B22id = self .local_output_var ["B22" ]
336+
337+ # spatial derivatives
338+ u_x = jacobian (nn_output_var , nn_input_var , i = uid , j = xid )
339+ v_x = jacobian (nn_output_var , nn_input_var , i = vid , j = xid )
340+ u_y = jacobian (nn_output_var , nn_input_var , i = uid , j = yid )
341+ v_y = jacobian (nn_output_var , nn_input_var , i = vid , j = yid )
342+ s_x = jacobian (nn_output_var , nn_input_var , i = sid , j = xid )
343+ s_y = jacobian (nn_output_var , nn_input_var , i = sid , j = yid )
344+
345+ # unpacking normalized output
346+ u = slice_column (nn_output_var , uid )
347+ v = slice_column (nn_output_var , vid )
348+ H = slice_column (nn_output_var , Hid )
349+ taub = slice_column (nn_output_var , tauid )
350+ B11 = slice_column (nn_output_var , B11id )
351+ B12 = slice_column (nn_output_var , B12id )
352+ B22 = slice_column (nn_output_var , B22id )
353+
354+ eta = 0.5 * self .B * (u_x ** 2.0 + v_y ** 2.0 + 0.25 * (u_y + v_x )** 2.0 + u_x * v_y + self .eps )** (0.5 * (1.0 - self .n )/ self .n )
355+ # stress tensor
356+ etaH = eta * H
357+ dB11 = B11 - etaH * (4 * u_x + 2 * v_y )
358+ dB22 = B22 - etaH * (4 * v_y + 2 * u_x )
359+ dB12 = B12 - etaH * ( u_y + v_x )
360+
361+ # Getting the other derivatives
362+ sigma11 = jacobian (nn_output_var , nn_input_var , i = B11id , j = xid )
363+ sigma12 = jacobian (nn_output_var , nn_input_var , i = B12id , j = yid )
364+
365+ sigma21 = jacobian (nn_output_var , nn_input_var , i = B12id , j = xid )
366+ sigma22 = jacobian (nn_output_var , nn_input_var , i = B22id , j = yid )
367+
368+ # compute the basal stress
369+ u_norm = (u ** 2 + v ** 2 + self .eps ** 2 )** 0.5
370+
371+ f1 = sigma11 + sigma12 - abs (taub )* u / (u_norm ) - self .rhoi * self .g * H * s_x
372+ f2 = sigma21 + sigma22 - abs (taub )* v / (u_norm ) - self .rhoi * self .g * H * s_y
373+
374+ return [f1 , f2 , dB11 , dB12 , dB22 ] #}}}
375+ def _pde_jax (self , nn_input_var , nn_output_var ): #{{{
376+ return self ._pde (nn_input_var , nn_output_var ) #}}}
377+ #}}}
378+ #}}}
287379# SSA variable B {{{
288380class SSAVariableBEquationParameter (EquationParameter , Constants ):
289381 """ default parameters for SSA, with spatially varying rheology B
0 commit comments