コード例 #1
0
ファイル: PresInc.py プロジェクト: arnsong/proteus
    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
コード例 #2
0
ファイル: AddedMass.py プロジェクト: arnsong/proteus
 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
コード例 #3
0
 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
コード例 #4
0
ファイル: PresInit.py プロジェクト: mhartman88/proteus
 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
コード例 #5
0
 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
コード例 #6
0
ファイル: PresInit.py プロジェクト: arnsong/proteus
 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
コード例 #7
0
 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
コード例 #8
0
 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
コード例 #9
0
ファイル: PresInc.py プロジェクト: zhang-alvin/proteus
    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
コード例 #10
0
ファイル: ADR.py プロジェクト: zhishang80/proteus
 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