Path: blob/devel/elmerice/examples/InverseMethods_OLD/Adjoint_Mu_GradientValid.sif
3203 views
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! Compare the total derivative of the cost function computed as: ! (1) dJ=P.G where P is a perturbation vector of the variable of interest ! G is the gradient of the cost function computed by an inverse method ! (2) [J(V+hP)-J(V)]/h : forward finite difference computation of the derivative ! V is the variable of interest ! h is the step size ! ! ! Compute (1) from at the first iteration and update V=Vini+hP, h=1 ! Compute (2) for all the other iteration with h^i+1=h^i/2 ! ! RESULTS stored in : ! Gradient Validation section ! Result File = File "GradientValidation_$name".dat" ! gives: h, abs(1-2)/1, (1), (2) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! check keywords warn ! name of the run used for the outputs $name="Adjoint_Mu_GradientValidation" $Lambda=0.0e00 ! Regularistaion parameter! not implemented for Mu optimisation!! has to be 0!! ! Domaine definition $Lx = 200.0e3 $Ly = 50.0e03 !Reference Slip Coefficicient used to construct surface velocities $ function betaSquare(tx) {\ Lx = 200.0e3;\ Ly = 50.0e03;\ yearinsec = 365.25*24*60*60;\ F1=sin(3.0*pi*tx(0)/Lx)*sin(pi*tx(1)/Ly);\ F2=sin(pi*tx(0)/(2.0*Lx))*cos(4.0*pi*tx(1)/Ly);\ beta=5.0e3*F1+5.0e03*F2;\ _betaSquare=beta*beta/(1.0e06*yearinsec);\ } !Reference Viscosity used to construct surface velocities $ function MuSquare(tx) {\ Lx = 200.0e3;\ Ly = 50.0e03;\ yearinsec = 365.25*24*60*60;\ F1=sin(3.0*pi*tx(0)/Lx)*sin(pi*tx(1)/Ly);\ F2=sin(pi*tx(0)/(2.0*Lx))*cos(4.0*pi*tx(1)/Ly);\ mu=sqrt(1.8e08)+1.0e03*(F1+F2);\ _MuSquare=mu*mu*1.0e-6*(2.0*yearinsec)^(-1.0/3.0);\ } !some constants $yearinsec = 365.25*24*60*60 $rhoi = 917.0/(1.0e6*yearinsec^2) ! MPa - a - m $gravity = -9.81*yearinsec^2 Header Mesh DB "." "mesh2D" End Constants End !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Simulation Coordinate System = Cartesian 3D Simulation Type = Steady State ! Internal extrusion Extruded Mesh Levels=5 Output Intervals = 1 Steady State Max Iterations = 20 Steady State Min Iterations = 1 ! Output File = "Test_$name".result" ! Post File = "Test_$name".ep" max output level = 3 End !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! Main ice body Body 1 Equation = 1 Body Force = 1 Material = 1 Initial Condition = 1 End !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Initial Condition 1 BetaS = Variable coordinate 1, Coordinate 2 REAL MATC "betaSquare(tx)" MuS = Variable coordinate 1, Coordinate 2 REAL MATC "MuSquare(tx)" ! initial guess for (square root) the ice viscosity Mu = REAL $sqrt(1.8e8*1.0e-6*(2.0*yearinsec)^(-1.0/3.0)) ! the perturbation variable MuP = REAL $0.1*sqrt(1.8e8*1.0e-6*(2.0*yearinsec)^(-1.0/3.0)) Pressure = Real 0.0 Velocity 1 = Real 0.0 Velocity 2 = Real 0.0 Velocity 3 = Real 0.0 Adjoint 1 = Real 0.0 Adjoint 2 = Real 0.0 Adjoint 3 = Real 0.0 Adjoint 4 = Real 0.0 ! Surface velocities (data) Vsurfini 1 = Variable Coordinate 1 Real procedure "Executables/USF_Init" "UIni" Vsurfini 2 = Variable Coordinate 1 Real procedure "Executables/USF_Init" "VIni" End !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Body Force 1 Flow BodyForce 1 = Real 0.0 Flow BodyForce 2 = Real 0.0 Flow BodyForce 3 = Real $gravity End !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! ice material properties in MPa - m - a system Material 1 Density = Real 9.1376e-19 Viscosity Model = String "power law" ! Viscosity defined as mu^2 to ensure >0 Viscosity = Variable mu Real MATC "tx*tx" Viscosity Exponent = Real $1.0e00/3.0e00 Critical Shear Rate = Real 1.0e-10 End !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Solver 1 Exec Solver = Before simulation Equation = "MapCoordinate" Procedure = "StructuredMeshMapper" "StructuredMeshMapper" Active Coordinate = Integer 3 End !!!! Navier-Stokes = forward model Solver 2 Equation = "Navier-Stokes" Stabilize = logical True flow model = Stokes !mandatory to save bulk stiffness matrix calculate loads = Logical True Linear System Solver = Iterative Linear System Iterative Method = GMRES Linear System GMRES Restart = 100 Linear System Preconditioning= ILU0 Linear System Convergence Tolerance= 1.0e-12 Linear System Max Iterations = 1000 ! system self adjoint if Newton is used for the last iterations Nonlinear System Max Iterations = Integer 100 Nonlinear System Convergence Tolerance = Real 1.0e-10 Nonlinear System Newton After Iterations = Integer 10 Nonlinear System Newton After Tolerance = Real 1.0e-03 Nonlinear System Relaxation Factor = Real 1.0 Steady State Convergence Tolerance = Real 1.0e-12 ! Define some useful Variables Exported Variable 1 = BetaS Exported Variable 1 DOFS = 1 Exported Variable 2 = MuS Exported Variable 2 DOFS = 1 ! square root of the Viscosity Exported Variable 3 = mu Exported Variable 3 DOFS = Integer 1 ! the perturbation variable Exported Variable 4 = muP Exported Variable 4 DOFS = Integer 1 ! derivative of the cost fn wr to mu Exported Variable 5 = DJDmu Exported Variable 5 DOFS = Integer 1 ! value of the cost function Exported Variable 6 = CostValue Exported Variable 6 DOFS = Integer 1 ! Variable used to force the adjoint system/update in CostSolver Exported Variable 7 = Velocityb Exported Variable 7 DOFs = Integer 4 Exported Variable 8 = VsurfIni Exported Variable 8 DOFS = Integer 2 End !!! Compute Cost function !!!!!!!! Has to be run before the Adjoint Solver as adjoint forcing is computed here !!!!! Solver 3 Equation = "Cost" !! Solver need to be associated => Define dumy variable Variable = -nooutput "CostV" Variable DOFs = 1 procedure = "ElmerIceSolvers" "CostSolver_Adjoint" Cost Variable Name = String "CostValue" ! Name of Cost Variable Optimized Variable Name = String "Mu" ! Name of Beta for Regularization Lambda = Real $Lambda ! Regularization Coef ! save the cost as a function of iterations Cost Filename = File "Cost_$name".dat" end !!!! Adjoint Solver Solver 4 !!! needed only at the first iteration for computation of the total derivative with the inverse method Exec Interval = 100 Equation = "Adjoint" Variable = Adjoint Variable Dofs = 4 procedure = "ElmerIceSolvers" "AdjointSolver" !Name of the flow solution solver Flow Solution Equation Name = string "Navier-Stokes" Linear System Solver = Iterative Linear System Iterative Method = GMRES Linear System GMRES Restart = 100 Linear System Preconditioning= ILU0 Linear System Convergence Tolerance= 1.0e-12 Linear System Max Iterations = 1000 End !!!!! Compute Derivative of Cost function / Mu Solver 5 !!! needed only at the first iteration for computation of the total derivative with the inverse method Exec Interval = 100 Equation = "DJDmu" !! Solver need to be associated => Define dumy variable Variable = -nooutput "DJDBV" Variable DOFs = 1 procedure = "DJDmu_Adjoint" "DJDMu_Adjoint" Flow Solution Name = String "Flow Solution" Adjoint Solution Name = String "Adjoint" Optimized Variable Name = String "mu" ! Name of Beta variable Gradient Variable Name = String "DJDmu" ! Name of gradient variable SquareFormulation = Logical True ! Viscosity not define as Mu^2 end !!!!! Gradient Validation !!!!!! Compute total derivative and update the step size for the finite difference computation Solver 6 Equation = "GradientValidation" !! Solver need to be associated => Define dumy variable Variable = -nooutput "UB" Variable DOFs = 1 procedure = "./Executables/GradientValidation" "GradientValidation" Cost Variable Name = String "CostValue" Optimized Variable Name = String "mu" Perturbed Variable Name = String "muP" Gradient Variable Name = String "DJDmu" Result File = File "GradientValidation_$name".dat" end Solver 7 Equation = "ResultOutput" Procedure = File "ResultOutputSolve" "ResultOutputSolver" Output File Name = string "Output_$name"" Vtu Format = logical true Binary Output = True Single Precision = True Vector Field 1 = "Velocity" Scalar Field 1 = Mu Scalar Field 2 = MuS Scalar Field 3 = Adjoint 1 Scalar Field 4 = Adjoint 2 Scalar Field 5 = Adjoint 3 Scalar Field 6 = VsurfIni 1 Scalar Field 7 = VsurfIni 2 End !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Equation 1 Active Solvers (7)= 1 2 3 4 5 6 7 NS Convect= False End !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Boundary Condition 1 Name = "Side Walls" Target Boundaries(2) = 1 3 Velocity 1 = Real 0.0 Velocity 2 = Real 0.0 !Dirichlet BC => Dirichlet = 0 for Adjoint Adjoint 1 = Real 0.0 Adjoint 2 = Real 0.0 End Boundary Condition 2 Name = "Inflow" Target Boundaries = 4 Velocity 1 = Variable Coordinate 2 REAL MATC "4.753e-6*yearinsec*(sin(2.0*pi*(Ly-tx)/Ly)+2.5*sin(pi*(Ly-tx)/Ly))" Velocity 2 = Real 0.0 !Dirichlet BC => Dirichlet = 0 for Adjoint Adjoint 1 = Real 0.0 Adjoint 2 = Real 0.0 End Boundary Condition 3 Name = "Front" Target Boundaries = 2 Velocity 1 = Variable Coordinate 2 REAL MATC "1.584e-5*yearinsec*(sin(2.0*pi*(Ly-tx)/Ly)+2.5*sin(pi*(Ly-tx)/Ly)+0.5*sin(3.0*pi*(Ly-tx)/Ly))" Velocity 2 = Real 0.0 !Dirichlet BC => Dirichlet = 0 for Adjoint Adjoint 1 = Real 0.0 Adjoint 2 = Real 0.0 End Boundary Condition 4 Name = "bed" !Target Boundaries = 5 Save Line = Logical True Bottom Surface = Variable Coordinate 1 REAL procedure "Executables/USF_Init" "zbIni" Normal-Tangential Velocity = Logical True Normal-Tangential Adjoint = Logical True Adjoint Force BC = Logical True Velocity 1 = Real 0.0e0 Adjoint 1 = Real 0.0e0 Slip Coefficient 2 = Equals BetaS Slip Coefficient 3 = Equals BetaS End ! Upper Surface Boundary Condition 5 Name = "Surface" !Target Boundaries = 6 Save Line = Logical True Top Surface = Variable Coordinate 1 REAL procedure "Executables/USF_Init" "zsIni" ! Definition of the Cost function Adjoint Cost = Variable Velocity 1 , Vsurfini 1 , Velocity 2 , Vsurfini 2 Real MATC "0.5*((tx(0)-tx(1))*(tx(0)-tx(1))+(tx(2)-tx(3))*(tx(2)-tx(3)))" ! derivative of the cost function wr u and v Adjoint Cost der 1 = Variable Velocity 1 , Vsurfini 1 Real MATC "tx(0)-tx(1)" Adjoint Cost der 2 = Variable Velocity 2 , Vsurfini 2 Real MATC "tx(0)-tx(1)" End