def getJacobian(self, jacobian): cfemIntegrals.zeroJacobian_CSR(self.nNonzerosInJacobian, jacobian) self.presinc.calculateJacobian( # element self.u[0].femSpace.elementMaps.psi, self.u[0].femSpace.elementMaps.grad_psi, self.mesh.nodeArray, self.mesh.elementNodesArray, self.elementQuadratureWeights[('u', 0)], self.u[0].femSpace.psi, self.u[0].femSpace.grad_psi, self.u[0].femSpace.psi, self.u[0].femSpace.grad_psi, # element boundary self.u[0].femSpace.elementMaps.psi_trace, self.u[0].femSpace.elementMaps.grad_psi_trace, self.elementBoundaryQuadratureWeights[('u', 0)], self.u[0].femSpace.psi_trace, self.u[0].femSpace.grad_psi_trace, self.u[0].femSpace.psi_trace, self.u[0].femSpace.grad_psi_trace, self.u[0].femSpace.elementMaps.boundaryNormals, self.u[0].femSpace.elementMaps.boundaryJacobians, self.mesh.nElements_global, self.numericalFlux.isDOFBoundary[0], self.ebqe[('diffusiveFlux_bc_flag', 0, 0)], self.u[0].femSpace.dofMap.l2g, self.u[0].dof, self.coefficients.fluidModel.timeIntegration.alpha_bdf, self.coefficients.fluidModel.q[('velocity', 0)], self.coefficients.fluidModel.coefficients.q_velocity_solid, self.coefficients.fluidModel.coefficients.q_vos, self.coefficients.fluidModel.coefficients.rho_s, self.coefficients.fluidModel.coefficients.q_rho, self.coefficients.rho_s_min, self.coefficients.rho_f_min, self.coefficients.fluidModel.ebqe[('velocity', 0)], self.coefficients.fluidModel.coefficients.ebqe_velocity_solid, self.coefficients.fluidModel.coefficients.ebqe_vos, self.coefficients.fluidModel.coefficients.ebqe_rho, self.csrRowIndeces[(0, 0)], self.csrColumnOffsets[(0, 0)], jacobian, self.mesh.nExteriorElementBoundaries_global, self.mesh.exteriorElementBoundariesArray, self.mesh.elementBoundaryElementsArray, self.mesh.elementBoundaryLocalElementBoundariesArray, self.csrColumnOffsets_eb[(0, 0)]) if self.coefficients.fixNullSpace: dofN = 0 global_dofN = self.offset[0] + self.stride[0] * dofN for i in range(self.rowptr[global_dofN], self.rowptr[global_dofN + 1]): if (self.colind[i] == global_dofN): self.nzval[i] = 1.0 else: self.nzval[i] = 0.0 log("Jacobian ", level=10, data=jacobian) # mwf decide if this is reasonable for solver statistics self.nonlinear_function_jacobian_evaluations += 1 return jacobian
def getJacobian(self, jacobian): cfemIntegrals.zeroJacobian_CSR(self.nNonzerosInJacobian, jacobian) self.addedMass.calculateJacobian( # element self.u[0].femSpace.elementMaps.psi, self.u[0].femSpace.elementMaps.grad_psi, self.mesh.nodeArray, self.mesh.elementNodesArray, self.elementQuadratureWeights[('u', 0)], self.u[0].femSpace.psi, self.u[0].femSpace.grad_psi, self.u[0].femSpace.psi, self.u[0].femSpace.grad_psi, # element boundary self.u[0].femSpace.elementMaps.psi_trace, self.u[0].femSpace.elementMaps.grad_psi_trace, self.elementBoundaryQuadratureWeights[('u', 0)], self.u[0].femSpace.psi_trace, self.u[0].femSpace.grad_psi_trace, self.u[0].femSpace.psi_trace, self.u[0].femSpace.grad_psi_trace, self.u[0].femSpace.elementMaps.boundaryNormals, self.u[0].femSpace.elementMaps.boundaryJacobians, self.mesh.nElements_global, self.u[0].femSpace.dofMap.l2g, self.u[0].dof, self.coefficients.q_rho, self.csrRowIndeces[(0, 0)], self.csrColumnOffsets[(0, 0)], jacobian, self.mesh.nExteriorElementBoundaries_global, self.mesh.exteriorElementBoundariesArray, self.mesh.elementBoundaryElementsArray, self.mesh.elementBoundaryLocalElementBoundariesArray, self.csrColumnOffsets_eb[(0, 0)]) for dofN in self.dirichletConditionsForceDOF[0].DOFBoundaryConditionsDict.keys(): global_dofN = self.offset[0] + self.stride[0] * dofN self.nzval[numpy.where(self.colind == global_dofN)] = 0.0 # column self.nzval[self.rowptr[global_dofN]:self.rowptr[global_dofN + 1]] = 0.0 # row zeroRow = True for i in range(self.rowptr[global_dofN], self.rowptr[global_dofN + 1]): # row if (self.colind[i] == global_dofN): self.nzval[i] = 1.0 zeroRow = False if zeroRow: raise RuntimeError("Jacobian has a zero row because sparse matrix has no diagonal entry at row " + `global_dofN`+". You probably need add diagonal mass or reaction term") logEvent("Jacobian ", level=10, data=jacobian) self.nonlinear_function_jacobian_evaluations += 1 return jacobian
def getJacobian(self, jacobian): cfemIntegrals.zeroJacobian_CSR(self.nNonzerosInJacobian, jacobian) self.addedMass.calculateJacobian( # element self.u[0].femSpace.elementMaps.psi, self.u[0].femSpace.elementMaps.grad_psi, self.mesh.nodeArray, self.mesh.elementNodesArray, self.elementQuadratureWeights[('u', 0)], self.u[0].femSpace.psi, self.u[0].femSpace.grad_psi, self.u[0].femSpace.psi, self.u[0].femSpace.grad_psi, # element boundary self.u[0].femSpace.elementMaps.psi_trace, self.u[0].femSpace.elementMaps.grad_psi_trace, self.elementBoundaryQuadratureWeights[('u', 0)], self.u[0].femSpace.psi_trace, self.u[0].femSpace.grad_psi_trace, self.u[0].femSpace.psi_trace, self.u[0].femSpace.grad_psi_trace, self.u[0].femSpace.elementMaps.boundaryNormals, self.u[0].femSpace.elementMaps.boundaryJacobians, self.mesh.nElements_global, self.u[0].femSpace.dofMap.l2g, self.u[0].dof, self.coefficients.q_rho, self.csrRowIndeces[(0, 0)], self.csrColumnOffsets[(0, 0)], jacobian.getCSRrepresentation()[2], self.mesh.nExteriorElementBoundaries_global, self.mesh.exteriorElementBoundariesArray, self.mesh.elementBoundaryElementsArray, self.mesh.elementBoundaryLocalElementBoundariesArray, self.csrColumnOffsets_eb[(0, 0)]) for dofN in list(self.dirichletConditionsForceDOF[0].DOFBoundaryConditionsDict.keys()): global_dofN = self.offset[0] + self.stride[0] * dofN self.nzval[np.where(self.colind == global_dofN)] = 0.0 # column self.nzval[self.rowptr[global_dofN]:self.rowptr[global_dofN + 1]] = 0.0 # row zeroRow = True for i in range(self.rowptr[global_dofN], self.rowptr[global_dofN + 1]): # row if (self.colind[i] == global_dofN): self.nzval[i] = 1.0 zeroRow = False if zeroRow: raise RuntimeError("Jacobian has a zero row because sparse matrix has no diagonal entry at row " + repr(global_dofN)+". You probably need add diagonal mass or reaction term") logEvent("Jacobian ", level=10, data=jacobian) self.nonlinear_function_jacobian_evaluations += 1 return jacobian
def getJacobian(self, jacobian): cfemIntegrals.zeroJacobian_CSR(self.nNonzerosInJacobian, jacobian) argsDict = cArgumentsDict.ArgumentsDict() argsDict["mesh_trial_ref"] = self.u[0].femSpace.elementMaps.psi argsDict["mesh_grad_trial_ref"] = self.u[ 0].femSpace.elementMaps.grad_psi argsDict["mesh_dof"] = self.mesh.nodeArray argsDict["mesh_l2g"] = self.mesh.elementNodesArray argsDict["dV_ref"] = self.elementQuadratureWeights[('u', 0)] argsDict["u_trial_ref"] = self.u[0].femSpace.psi argsDict["u_grad_trial_ref"] = self.u[0].femSpace.grad_psi argsDict["u_test_ref"] = self.u[0].femSpace.psi argsDict["u_grad_test_ref"] = self.u[0].femSpace.grad_psi argsDict["mesh_trial_trace_ref"] = self.u[ 0].femSpace.elementMaps.psi_trace argsDict["mesh_grad_trial_trace_ref"] = self.u[ 0].femSpace.elementMaps.grad_psi_trace argsDict["dS_ref"] = self.elementBoundaryQuadratureWeights[('u', 0)] argsDict["u_trial_trace_ref"] = self.u[0].femSpace.psi_trace argsDict["u_grad_trial_trace_ref"] = self.u[0].femSpace.grad_psi_trace argsDict["u_test_trace_ref"] = self.u[0].femSpace.psi_trace argsDict["u_grad_test_trace_ref"] = self.u[0].femSpace.grad_psi_trace argsDict["normal_ref"] = self.u[0].femSpace.elementMaps.boundaryNormals argsDict["boundaryJac_ref"] = self.u[ 0].femSpace.elementMaps.boundaryJacobians argsDict["nElements_global"] = self.mesh.nElements_global argsDict["useMetrics"] = self.coefficients.useMetrics argsDict["epsFactHeaviside"] = self.coefficients.epsFactHeaviside argsDict["epsFactDirac"] = self.coefficients.epsFactDirac argsDict["epsFactDiffusion"] = self.coefficients.epsFactDiffusion argsDict["u_l2g"] = self.u[0].femSpace.dofMap.l2g argsDict["elementDiameter"] = self.elementDiameter argsDict["nodeDiametersArray"] = self.mesh.nodeDiametersArray argsDict["u_dof"] = self.u[0].dof argsDict["q_phi"] = self.coefficients.q_u_ls argsDict["q_normal_phi"] = self.coefficients.q_n_ls argsDict["q_H"] = self.coefficients.q_H_vof argsDict["q_vos"] = self.coefficients.q_vos argsDict["csrRowIndeces_u_u"] = self.csrRowIndeces[(0, 0)] argsDict["csrColumnOffsets_u_u"] = self.csrColumnOffsets[(0, 0)] argsDict["globalJacobian"] = jacobian.getCSRrepresentation()[2] self.presinit.calculateJacobian(argsDict) log("Jacobian ", level=10, data=jacobian) # mwf decide if this is reasonable for solver statistics self.nonlinear_function_jacobian_evaluations += 1 return jacobian
def getJacobian(self, jacobian): cfemIntegrals.zeroJacobian_CSR(self.nNonzerosInJacobian, jacobian) self.presinit.calculateJacobian( # element self.u[0].femSpace.elementMaps.psi, self.u[0].femSpace.elementMaps.grad_psi, self.mesh.nodeArray, self.mesh.elementNodesArray, self.elementQuadratureWeights[('u', 0)], self.u[0].femSpace.psi, self.u[0].femSpace.grad_psi, self.u[0].femSpace.psi, self.u[0].femSpace.grad_psi, # element boundary self.u[0].femSpace.elementMaps.psi_trace, self.u[0].femSpace.elementMaps.grad_psi_trace, self.elementBoundaryQuadratureWeights[('u', 0)], self.u[0].femSpace.psi_trace, self.u[0].femSpace.grad_psi_trace, self.u[0].femSpace.psi_trace, self.u[0].femSpace.grad_psi_trace, self.u[0].femSpace.elementMaps.boundaryNormals, self.u[0].femSpace.elementMaps.boundaryJacobians, self.mesh.nElements_global, self.coefficients.useMetrics, self.coefficients.epsFactHeaviside, self.coefficients.epsFactDirac, self.coefficients.epsFactDiffusion, self.u[0].femSpace.dofMap.l2g, self.elementDiameter, # self.mesh.elementDiametersArray, self.mesh.nodeDiametersArray, self.u[0].dof, self.coefficients.q_u_ls, self.coefficients.q_n_ls, self.coefficients.q_H_vof, self.coefficients.q_vos, self.csrRowIndeces[(0, 0)], self.csrColumnOffsets[(0, 0)], jacobian) log("Jacobian ", level=10, data=jacobian) # mwf decide if this is reasonable for solver statistics self.nonlinear_function_jacobian_evaluations += 1 return jacobian
def getJacobian(self, jacobian): #import superluWrappers #import numpy import pdb cfemIntegrals.zeroJacobian_CSR(self.nNonzerosInJacobian, jacobian) self.adr.calculateJacobian( #element self.u[0].femSpace.elementMaps.psi, self.u[0].femSpace.elementMaps.grad_psi, self.mesh.nodeArray, self.mesh.elementNodesArray, self.elementQuadratureWeights[('u', 0)], self.u[0].femSpace.psi, self.u[0].femSpace.grad_psi, self.u[0].femSpace.psi, self.u[0].femSpace.grad_psi, self.mesh.elementDiametersArray, self.q[('cfl', 0)], self.shockCapturing.shockCapturingFactor, self.coefficients.sc_uref, self.coefficients.sc_beta, self.coefficients.useMetrics, #element boundary self.u[0].femSpace.elementMaps.psi_trace, self.u[0].femSpace.elementMaps.grad_psi_trace, self.elementBoundaryQuadratureWeights[('u', 0)], self.u[0].femSpace.psi_trace, self.u[0].femSpace.grad_psi_trace, self.u[0].femSpace.psi_trace, self.u[0].femSpace.grad_psi_trace, self.u[0].femSpace.elementMaps.boundaryNormals, self.u[0].femSpace.elementMaps.boundaryJacobians, self.mesh.nElements_global, self.u[0].femSpace.dofMap.l2g, self.u[0].dof, self.coefficients.sdInfo[(0, 0)][0], self.coefficients.sdInfo[(0, 0)][1], self.q[('a', 0, 0)], self.q[('df', 0, 0)], self.q[('r', 0)], self.shockCapturing.lag, self.shockCapturing.shockCapturingFactor, self.shockCapturing.numDiff[0], self.shockCapturing.numDiff_last[0], self.csrRowIndeces[(0, 0)], self.csrColumnOffsets[(0, 0)], jacobian.getCSRrepresentation()[2], self.mesh.nExteriorElementBoundaries_global, self.mesh.exteriorElementBoundariesArray, self.mesh.elementBoundaryElementsArray, self.mesh.elementBoundaryLocalElementBoundariesArray, self.ebqe[('a', 0, 0)], self.ebqe[('df', 0, 0)], self.numericalFlux.isDOFBoundary[0], self.numericalFlux.ebqe[('u', 0)], self.ebqe[('diffusiveFlux_bc_flag', 0, 0)], self.ebqe[('advectiveFlux_bc_flag', 0)], self.ebqe[('diffusiveFlux_bc', 0, 0)], self.ebqe[('advectiveFlux_bc', 0)], self.csrColumnOffsets_eb[(0, 0)], self.ebqe['penalty'], self.numericalFlux.boundaryAdjoint_sigma) log("Jacobian ", level=10, data=jacobian) #mwf decide if this is reasonable for solver statistics self.nonlinear_function_jacobian_evaluations += 1 return jacobian
def getJacobian(self, jacobian): cfemIntegrals.zeroJacobian_CSR(self.nNonzerosInJacobian, jacobian) if self.nSpace_global == 2: self.csrRowIndeces[(0, 2)] = self.csrRowIndeces[(0, 1)] self.csrColumnOffsets[(0, 2)] = self.csrColumnOffsets[(0, 1)] self.csrRowIndeces[(1, 2)] = self.csrRowIndeces[(0, 1)] self.csrColumnOffsets[(1, 2)] = self.csrColumnOffsets[(0, 1)] self.csrRowIndeces[(2, 0)] = self.csrRowIndeces[(1, 0)] self.csrColumnOffsets[(2, 0)] = self.csrColumnOffsets[(1, 0)] self.csrRowIndeces[(2, 1)] = self.csrRowIndeces[(1, 0)] self.csrColumnOffsets[(2, 1)] = self.csrColumnOffsets[(1, 0)] self.csrRowIndeces[(2, 2)] = self.csrRowIndeces[(1, 0)] self.csrColumnOffsets[(2, 2)] = self.csrColumnOffsets[(1, 0)] self.csrColumnOffsets_eb[(0, 2)] = self.csrColumnOffsets[(0, 1)] self.csrColumnOffsets_eb[(1, 2)] = self.csrColumnOffsets[(0, 1)] self.csrColumnOffsets_eb[(2, 2)] = self.csrColumnOffsets[(0, 1)] self.csrColumnOffsets_eb[(2, 0)] = self.csrColumnOffsets[(0, 1)] self.csrColumnOffsets_eb[(2, 1)] = self.csrColumnOffsets[(0, 1)] self.csrColumnOffsets_eb[(2, 2)] = self.csrColumnOffsets[(0, 1)] argsDict = cArgumentsDict.ArgumentsDict() argsDict["mesh_trial_ref"] = self.u[0].femSpace.elementMaps.psi argsDict["mesh_grad_trial_ref"] = self.u[ 0].femSpace.elementMaps.grad_psi argsDict["mesh_dof"] = self.mesh.nodeArray argsDict["mesh_l2g"] = self.mesh.elementNodesArray argsDict["dV_ref"] = self.elementQuadratureWeights[('u', 0)] argsDict["disp_trial_ref"] = self.u[0].femSpace.psi argsDict["disp_grad_trial_ref"] = self.u[0].femSpace.grad_psi argsDict["disp_test_ref"] = self.u[0].femSpace.psi argsDict["disp_grad_test_ref"] = self.u[0].femSpace.grad_psi argsDict["mesh_trial_trace_ref"] = self.u[ 0].femSpace.elementMaps.psi_trace argsDict["mesh_grad_trial_trace_ref"] = self.u[ 0].femSpace.elementMaps.grad_psi_trace argsDict["dS_ref"] = self.elementBoundaryQuadratureWeights[('u', 0)] argsDict["disp_trial_trace_ref"] = self.u[0].femSpace.psi_trace argsDict["disp_grad_trial_trace_ref"] = self.u[ 0].femSpace.grad_psi_trace argsDict["disp_test_trace_ref"] = self.u[0].femSpace.psi_trace argsDict["disp_grad_test_trace_ref"] = self.u[ 0].femSpace.grad_psi_trace argsDict["normal_ref"] = self.u[0].femSpace.elementMaps.boundaryNormals argsDict["boundaryJac_ref"] = self.u[ 0].femSpace.elementMaps.boundaryJacobians argsDict["nElements_global"] = self.mesh.nElements_global argsDict["materialTypes"] = self.mesh.elementMaterialTypes argsDict["nMaterialProperties"] = self.coefficients.nMaterialProperties argsDict["materialProperties"] = self.coefficients.materialProperties argsDict["disp_l2g"] = self.u[0].femSpace.dofMap.l2g argsDict["u_dof"] = self.u[0].dof argsDict["v_dof"] = self.u[1].dof argsDict["w_dof"] = self.u[2].dof argsDict["bodyForce"] = self.coefficients.bodyForce argsDict["csrRowIndeces_u_u"] = self.csrRowIndeces[(0, 0)] argsDict["csrColumnOffsets_u_u"] = self.csrColumnOffsets[(0, 0)] argsDict["csrRowIndeces_u_v"] = self.csrRowIndeces[(0, 1)] argsDict["csrColumnOffsets_u_v"] = self.csrColumnOffsets[(0, 1)] argsDict["csrRowIndeces_u_w"] = self.csrRowIndeces[(0, 2)] argsDict["csrColumnOffsets_u_w"] = self.csrColumnOffsets[(0, 2)] argsDict["csrRowIndeces_v_u"] = self.csrRowIndeces[(1, 0)] argsDict["csrColumnOffsets_v_u"] = self.csrColumnOffsets[(1, 0)] argsDict["csrRowIndeces_v_v"] = self.csrRowIndeces[(1, 1)] argsDict["csrColumnOffsets_v_v"] = self.csrColumnOffsets[(1, 1)] argsDict["csrRowIndeces_v_w"] = self.csrRowIndeces[(1, 2)] argsDict["csrColumnOffsets_v_w"] = self.csrColumnOffsets[(1, 2)] argsDict["csrRowIndeces_w_u"] = self.csrRowIndeces[(2, 0)] argsDict["csrColumnOffsets_w_u"] = self.csrColumnOffsets[(2, 0)] argsDict["csrRowIndeces_w_v"] = self.csrRowIndeces[(2, 1)] argsDict["csrColumnOffsets_w_v"] = self.csrColumnOffsets[(2, 1)] argsDict["csrRowIndeces_w_w"] = self.csrRowIndeces[(2, 2)] argsDict["csrColumnOffsets_w_w"] = self.csrColumnOffsets[(2, 2)] argsDict["globalJacobian"] = jacobian.getCSRrepresentation()[2] argsDict[ "nExteriorElementBoundaries_global"] = self.mesh.nExteriorElementBoundaries_global argsDict[ "exteriorElementBoundariesArray"] = self.mesh.exteriorElementBoundariesArray argsDict[ "elementBoundaryElementsArray"] = self.mesh.elementBoundaryElementsArray argsDict[ "elementBoundaryLocalElementBoundariesArray"] = self.mesh.elementBoundaryLocalElementBoundariesArray argsDict["isDOFBoundary_u"] = self.numericalFlux.isDOFBoundary[0] argsDict["isDOFBoundary_v"] = self.numericalFlux.isDOFBoundary[1] argsDict["isDOFBoundary_w"] = self.numericalFlux.isDOFBoundary[2] argsDict["isStressFluxBoundary_u"] = self.ebqe[('stressFlux_bc_flag', 0)] argsDict["isStressFluxBoundary_v"] = self.ebqe[('stressFlux_bc_flag', 1)] argsDict["isStressFluxBoundary_w"] = self.ebqe[('stressFlux_bc_flag', 2)] argsDict["csrColumnOffsets_eb_u_u"] = self.csrColumnOffsets_eb[(0, 0)] argsDict["csrColumnOffsets_eb_u_v"] = self.csrColumnOffsets_eb[(0, 1)] argsDict["csrColumnOffsets_eb_u_w"] = self.csrColumnOffsets_eb[(0, 2)] argsDict["csrColumnOffsets_eb_v_u"] = self.csrColumnOffsets_eb[(1, 0)] argsDict["csrColumnOffsets_eb_v_v"] = self.csrColumnOffsets_eb[(1, 1)] argsDict["csrColumnOffsets_eb_v_w"] = self.csrColumnOffsets_eb[(1, 2)] argsDict["csrColumnOffsets_eb_w_u"] = self.csrColumnOffsets_eb[(2, 0)] argsDict["csrColumnOffsets_eb_w_v"] = self.csrColumnOffsets_eb[(2, 1)] argsDict["csrColumnOffsets_eb_w_w"] = self.csrColumnOffsets_eb[(2, 2)] self.moveMesh.calculateJacobian(argsDict) # Load the Dirichlet conditions directly into residual if self.forceStrongConditions: scaling = 1.0 # probably want to add some scaling to match non-dirichlet diagonals in linear system for cj in range(self.nc): for dofN in list(self.dirichletConditionsForceDOF[cj]. DOFBoundaryConditionsDict.keys()): global_dofN = self.offset[cj] + self.stride[cj] * dofN for i in range(self.rowptr[global_dofN], self.rowptr[global_dofN + 1]): if (self.colind[i] == global_dofN): self.nzval[i] = scaling else: self.nzval[i] = 0.0 logEvent("Jacobian ", level=10, data=jacobian) # mwf decide if this is reasonable for solver statistics self.nonlinear_function_jacobian_evaluations += 1 # jacobian.fwrite("jacobian_p"+`self.nonlinear_function_jacobian_evaluations`) return jacobian
def getJacobian(self, jacobian): cfemIntegrals.zeroJacobian_CSR(self.nNonzerosInJacobian, jacobian) self.presinc.calculateJacobian( # element self.u[0].femSpace.elementMaps.psi, self.u[0].femSpace.elementMaps.grad_psi, self.mesh.nodeArray, self.mesh.elementNodesArray, self.elementQuadratureWeights[('u', 0)], self.u[0].femSpace.psi, self.u[0].femSpace.grad_psi, self.u[0].femSpace.psi, self.u[0].femSpace.grad_psi, # element boundary self.u[0].femSpace.elementMaps.psi_trace, self.u[0].femSpace.elementMaps.grad_psi_trace, self.elementBoundaryQuadratureWeights[('u', 0)], self.u[0].femSpace.psi_trace, self.u[0].femSpace.grad_psi_trace, self.u[0].femSpace.psi_trace, self.u[0].femSpace.grad_psi_trace, self.u[0].femSpace.elementMaps.boundaryNormals, self.u[0].femSpace.elementMaps.boundaryJacobians, self.mesh.nElements_global, self.numericalFlux.isDOFBoundary[0], self.ebqe[('diffusiveFlux_bc_flag', 0, 0)], self.u[0].femSpace.dofMap.l2g, self.u[0].dof, self.coefficients.fluidModel.timeIntegration.alpha_bdf, self.coefficients.fluidModel.q[('velocity', 0)], self.coefficients.fluidModel.coefficients.q_velocity_solid, self.coefficients.fluidModel.coefficients.q_vos, self.coefficients.fluidModel.coefficients.rho_s, self.coefficients.fluidModel.coefficients.q_rho, self.coefficients.rho_s_min, self.coefficients.rho_f_min, self.coefficients.fluidModel.ebqe[('velocity', 0)], self.coefficients.fluidModel.coefficients.ebqe_velocity_solid, self.coefficients.fluidModel.coefficients.ebqe_vos, self.coefficients.fluidModel.coefficients.ebqe_rho, self.csrRowIndeces[(0, 0)], self.csrColumnOffsets[(0, 0)], jacobian.getCSRrepresentation()[2], self.mesh.nExteriorElementBoundaries_global, self.mesh.exteriorElementBoundariesArray, self.mesh.elementBoundaryElementsArray, self.mesh.elementBoundaryLocalElementBoundariesArray, self.csrColumnOffsets_eb[(0, 0)]) if self.coefficients.fixNullSpace and self.comm.rank() == 0: dofN = 0 global_dofN = self.offset[0] + self.stride[0] * dofN for i in range(self.rowptr[global_dofN], self.rowptr[global_dofN + 1]): if (self.colind[i] == global_dofN): self.nzval[i] = 1.0 else: self.nzval[i] = 0.0 log("Jacobian ", level=10, data=jacobian) # mwf decide if this is reasonable for solver statistics self.nonlinear_function_jacobian_evaluations += 1 return jacobian
def getJacobian(self, jacobian): #import superluWrappers #import numpy import pdb cfemIntegrals.zeroJacobian_CSR(self.nNonzerosInJacobian, jacobian) argsDict = cArgumentsDict.ArgumentsDict() argsDict["mesh_trial_ref"] = self.u[0].femSpace.elementMaps.psi argsDict["mesh_grad_trial_ref"] = self.u[ 0].femSpace.elementMaps.grad_psi argsDict["mesh_dof"] = self.mesh.nodeArray argsDict["mesh_l2g"] = self.mesh.elementNodesArray argsDict["dV_ref"] = self.elementQuadratureWeights[('u', 0)] argsDict["u_trial_ref"] = self.u[0].femSpace.psi argsDict["u_grad_trial_ref"] = self.u[0].femSpace.grad_psi argsDict["u_test_ref"] = self.u[0].femSpace.psi argsDict["u_grad_test_ref"] = self.u[0].femSpace.grad_psi argsDict["elementDiameter"] = self.mesh.elementDiametersArray argsDict["cfl"] = self.q[('cfl', 0)] argsDict["Ct_sge"] = self.shockCapturing.shockCapturingFactor argsDict["sc_uref"] = self.coefficients.sc_uref argsDict["sc_alpha"] = self.coefficients.sc_beta argsDict["useMetrics"] = self.coefficients.useMetrics argsDict["mesh_trial_trace_ref"] = self.u[ 0].femSpace.elementMaps.psi_trace argsDict["mesh_grad_trial_trace_ref"] = self.u[ 0].femSpace.elementMaps.grad_psi_trace argsDict["dS_ref"] = self.elementBoundaryQuadratureWeights[('u', 0)] argsDict["u_trial_trace_ref"] = self.u[0].femSpace.psi_trace argsDict["u_grad_trial_trace_ref"] = self.u[0].femSpace.grad_psi_trace argsDict["u_test_trace_ref"] = self.u[0].femSpace.psi_trace argsDict["u_grad_test_trace_ref"] = self.u[0].femSpace.grad_psi_trace argsDict["normal_ref"] = self.u[0].femSpace.elementMaps.boundaryNormals argsDict["boundaryJac_ref"] = self.u[ 0].femSpace.elementMaps.boundaryJacobians argsDict["nElements_global"] = self.mesh.nElements_global argsDict["u_l2g"] = self.u[0].femSpace.dofMap.l2g argsDict["u_dof"] = self.u[0].dof argsDict["sd_rowptr"] = self.coefficients.sdInfo[(0, 0)][0] argsDict["sd_colind"] = self.coefficients.sdInfo[(0, 0)][1] argsDict["q_a"] = self.q[('a', 0, 0)] argsDict["q_v"] = self.q[('df', 0, 0)] argsDict["q_r"] = self.q[('r', 0)] argsDict["lag_shockCapturing"] = self.shockCapturing.lag argsDict[ "shockCapturingDiffusion"] = self.shockCapturing.shockCapturingFactor argsDict["q_numDiff_u"] = self.shockCapturing.numDiff[0] argsDict["q_numDiff_u_last"] = self.shockCapturing.numDiff_last[0] argsDict["csrRowIndeces_u_u"] = self.csrRowIndeces[(0, 0)] argsDict["csrColumnOffsets_u_u"] = self.csrColumnOffsets[(0, 0)] argsDict["globalJacobian"] = jacobian.getCSRrepresentation()[2] argsDict[ "nExteriorElementBoundaries_global"] = self.mesh.nExteriorElementBoundaries_global argsDict[ "exteriorElementBoundariesArray"] = self.mesh.exteriorElementBoundariesArray argsDict[ "elementBoundaryElementsArray"] = self.mesh.elementBoundaryElementsArray argsDict[ "elementBoundaryLocalElementBoundariesArray"] = self.mesh.elementBoundaryLocalElementBoundariesArray argsDict["ebqe_a"] = self.ebqe[('a', 0, 0)] argsDict["ebqe_v"] = self.ebqe[('df', 0, 0)] argsDict["isDOFBoundary_u"] = self.numericalFlux.isDOFBoundary[0] argsDict["ebqe_bc_u_ext"] = self.numericalFlux.ebqe[('u', 0)] argsDict["isDiffusiveFluxBoundary_u"] = self.ebqe[( 'diffusiveFlux_bc_flag', 0, 0)] argsDict["isAdvectiveFluxBoundary_u"] = self.ebqe[( 'advectiveFlux_bc_flag', 0)] argsDict["ebqe_bc_flux_u_ext"] = self.ebqe[('diffusiveFlux_bc', 0, 0)] argsDict["ebqe_bc_advectiveFlux_u_ext"] = self.ebqe[( 'advectiveFlux_bc', 0)] argsDict["csrColumnOffsets_eb_u_u"] = self.csrColumnOffsets_eb[(0, 0)] argsDict["ebqe_penalty_ext"] = self.ebqe['penalty'] argsDict["eb_adjoint_sigma"] = self.numericalFlux.boundaryAdjoint_sigma argsDict["embeddedBoundary"] = self.coefficients.embeddedBoundary argsDict[ "embeddedBoundary_penalty"] = self.coefficients.embeddedBoundary_penalty argsDict[ "embeddedBoundary_ghost_penalty"] = self.coefficients.embeddedBoundary_ghost_penalty argsDict[ "embeddedBoundary_sdf_nodes"] = self.coefficients.embeddedBoundary_sdf_nodes argsDict["embeddedBoundary_sdf"] = self.q['embeddedBoundary_sdf'] argsDict["embeddedBoundary_normal"] = self.q['embeddedBoundary_normal'] argsDict["embeddedBoundary_u"] = self.q['embeddedBoundary_u'] argsDict["isActiveDOF"] = self.isActiveDOF self.adr.calculateJacobian(argsDict) log("Jacobian ", level=10, data=jacobian) self.nonlinear_function_jacobian_evaluations += 1 for global_dofN_a in np.argwhere(self.isActiveDOF == 0.0): global_dofN = global_dofN_a[0] for i in range(self.rowptr[global_dofN], self.rowptr[global_dofN + 1]): if (self.colind[i] == global_dofN): self.nzval[i] = 1.0 else: self.nzval[i] = 0.0 return jacobian