def _configure(self): """ Set members based using inventory. """ PetscComponent._configure(self) self.matrixType = self.inventory.matrixType self.timeStep = self.inventory.timeStep self.solver = self.inventory.solver self.output = self.inventory.output self.viewJacobian = self.inventory.viewJacobian self.jacobianViewer = self.inventory.jacobianViewer self.perfLogger = self.inventory.perfLogger import journal self._debug = journal.debug(self.name) if self.inventory.useCustomConstraintPC and \ not self.inventory.useSplitFields: print "WARNING: Request to use custom preconditioner for Lagrange " \ "constraints without splitting fields. " \ "Setting split fields flag to 'True'." self.inventory.useSplitFields = True ModuleFormulation.splitFields(self, self.inventory.useSplitFields) ModuleFormulation.useCustomConstraintPC(self, self.inventory.useCustomConstraintPC) return
def _initialize(self, dimension, normalizer): """ Create integrators for each element family. """ from pylith.mpi.Communicator import mpi_comm_world comm = mpi_comm_world() self.timeStep.initialize(normalizer) numTimeSteps = self.timeStep.numTimeSteps() totalTime = self.timeStep.totalTime from pylith.topology.SolutionFields import SolutionFields self.fields = SolutionFields(self.mesh()) self._debug.log(resourceUsageString()) if 0 == comm.rank: self._info.log("Initializing integrators.") for integrator in self.integrators: if not self.gravityField is None: integrator.gravityField(self.gravityField) integrator.initialize(totalTime, numTimeSteps, normalizer) ModuleFormulation.integrators(self, self.integrators) self._debug.log(resourceUsageString()) if 0 == comm.rank: self._info.log("Initializing constraints.") for constraint in self.constraints: constraint.initialize(totalTime, numTimeSteps, normalizer) self._debug.log(resourceUsageString()) if 0 == comm.rank: self._info.log("Setting up solution output.") for output in self.output.components(): output.initialize(self.mesh(), normalizer) output.writeInfo() output.open(totalTime, numTimeSteps) self._debug.log(resourceUsageString()) # Setup fields if 0 == comm.rank: self._info.log("Creating solution field.") #from pylith.utils.petsc import MemoryLogger #memoryLogger = MemoryLogger.singleton() #memoryLogger.setDebug(0) #memoryLogger.stagePush("Problem") self.fields.add("dispIncr(t->t+dt)", "displacement_increment") self.fields.add("disp(t)", "displacement") self.fields.add("residual", "residual") self.fields.solutionName("dispIncr(t->t+dt)") lengthScale = normalizer.lengthScale() pressureScale = normalizer.pressureScale() solution = self.fields.get("dispIncr(t->t+dt)") solution.subfieldAdd("displacement", dimension, solution.VECTOR, lengthScale.value) solution.subfieldAdd("lagrange_multiplier", dimension, solution.VECTOR, pressureScale.value) solution.subfieldsSetup() solution.setupSolnChart() solution.setupSolnDof(dimension) # Loop over integrators to adjust DOF layout for integrator in self.integrators: integrator.setupSolnDof(solution) solution.vectorFieldType(solution.VECTOR) solution.scale(lengthScale.value) for constraint in self.constraints: constraint.setConstraintSizes(solution) solution.allocate() solution.zeroAll() for constraint in self.constraints: constraint.setConstraints(solution) for integrator in self.integrators: integrator.checkConstraints(solution) #memoryLogger.stagePop() # This also creates a global order. solution.createScatter(solution.mesh()) #memoryLogger.stagePush("Problem") dispT = self.fields.get("disp(t)") dispT.vectorFieldType(dispT.VECTOR) dispT.scale(lengthScale.value) residual = self.fields.get("residual") residual.vectorFieldType(residual.VECTOR) residual.scale(lengthScale.value) #memoryLogger.stagePop() #memoryLogger.setDebug(0) self._debug.log(resourceUsageString()) return