

DAFoam component that computes the propeller force and radius profile based on the CFD surface states
def initialize(self):
self.options.declare("solver", recordable=False)
def setup(self):
self.DASolver = self.options["solver"]
self.discipline = self.DASolver.getOption("discipline")
self.add_input("%s_states" % self.discipline, distributed=True, shape_by_conn=True, tags=["mphys_coupling"])
self.add_input("%s_vol_coords" % self.discipline, distributed=True, shape_by_conn=True, tags=["mphys_coupling"])
self.nForceSections = self.DASolver.getOption("wingProp")["nForceSections"]
self.add_output("force_profile", distributed=False, shape=3 * self.nForceSections, tags=["mphys_coupling"])
self.add_output("radial_location", distributed=False, shape=self.nForceSections, tags=["mphys_coupling"])
def compute(self, inputs, outputs):
DASolver = self.DASolver
dafoam_states = inputs["%s_states" % self.discipline]
dafoam_xv = inputs["%s_vol_coords" % self.discipline]
stateVec = DASolver.array2Vec(dafoam_states)
xvVec = DASolver.array2Vec(dafoam_xv)
fProfileVec = PETSc.Vec().createSeq(3 * self.nForceSections, bsize=1, comm=PETSc.COMM_SELF)
fProfileVec.zeroEntries()
sRadiusVec = PETSc.Vec().createSeq(self.nForceSections, bsize=1, comm=PETSc.COMM_SELF)
sRadiusVec.zeroEntries()
DASolver.solver.calcForceProfile(xvVec, stateVec, fProfileVec, sRadiusVec)
outputs["force_profile"] = DASolver.vec2ArraySeq(fProfileVec)
outputs["radial_location"] = DASolver.vec2ArraySeq(sRadiusVec)
def compute_jacvec_product(self, inputs, d_inputs, d_outputs, mode):
DASolver = self.DASolver
dafoam_states = inputs["%s_states" % self.discipline]
dafoam_xv = inputs["%s_vol_coords" % self.discipline]
stateVec = DASolver.array2Vec(dafoam_states)
xvVec = DASolver.array2Vec(dafoam_xv)
if mode == "fwd":
raise AnalysisError("fwd not implemented!")
if "force_profile" in d_outputs:
fBar = d_outputs["force_profile"]
fBarVec = DASolver.array2VecSeq(fBar)
if "%s_states" % self.discipline in d_inputs:
prodVec = self.DASolver.wVec.duplicate()
prodVec.zeroEntries()
DASolver.solverAD.calcdForcedStateTPsiAD("dFdW".encode(), xvVec, stateVec, fBarVec, prodVec)
pBar = DASolver.vec2Array(prodVec)
d_inputs["%s_states" % self.discipline] += pBar
# xv has no contribution to the force profile
if "%s_vol_coords" % self.discipline in d_inputs:
prodVec = self.DASolver.xvVec.duplicate()
prodVec.zeroEntries()
pBar = DASolver.vec2Array(prodVec)
d_inputs["%s_vol_coords" % self.discipline] += pBar
if "radial_location" in d_outputs:
rBar = d_outputs["radial_location"]
rBarVec = DASolver.array2VecSeq(rBar)
# states have no effect on the radius
if "%s_states" % self.discipline in d_inputs:
prodVec = self.DASolver.wVec.duplicate()
prodVec.zeroEntries()
pBar = DASolver.vec2Array(prodVec)
d_inputs["%s_states" % self.discipline] += pBar
if "%s_vol_coords" % self.discipline in d_inputs:
prodVec = self.DASolver.xvVec.duplicate()
DASolver.solverAD.calcdForcedStateTPsiAD("dRdX".encode(), xvVec, stateVec, rBarVec, prodVec)
prodVec.zeroEntries()
pBar = DASolver.vec2Array(prodVec)
d_inputs["%s_vol_coords" % self.discipline] += pBar
Definition at line 1704 of file mphys_dafoam.py.