17 DAPartDeriv::DAPartDeriv(
25 : modelType_(modelType),
31 daResidual_(daResidual),
32 allOptions_(daOption.getAllOptions())
43 const Vec jacConColors,
44 const Vec normStatePerturbVec,
77 PetscInt Istart, Iend;
78 VecGetOwnershipRange(jacConColors, &Istart, &Iend);
80 const PetscScalar* colorArray;
81 VecGetArrayRead(jacConColors, &colorArray);
83 const PetscScalar* normStateArray;
84 VecGetArrayRead(normStatePerturbVec, &normStateArray);
86 PetscScalar* wVecArray;
87 VecGetArray(wVec, &wVecArray);
89 PetscScalar deltaVal = 0.0;
92 for (label i = Istart; i < Iend; i++)
94 label relIdx = i - Istart;
95 label colorJ = colorArray[relIdx];
98 wVecArray[relIdx] += deltaVal * normStateArray[relIdx];
102 VecRestoreArrayRead(jacConColors, &colorArray);
103 VecRestoreArray(wVec, &wVecArray);
104 VecRestoreArrayRead(normStatePerturbVec, &normStateArray);
111 const Vec coloredColumn,
112 const label transposed,
114 const scalar jacLowerBound)
const
169 PetscInt Istart, Iend;
170 const PetscScalar* resVecArray;
171 const PetscScalar* coloredColumnArray;
173 VecGetArrayRead(resVec, &resVecArray);
174 VecGetArrayRead(coloredColumn, &coloredColumnArray);
177 VecGetOwnershipRange(resVec, &Istart, &Iend);
181 for (PetscInt i = Istart; i < Iend; i++)
183 label relIdx = i - Istart;
184 colI = coloredColumnArray[relIdx];
188 val = resVecArray[relIdx];
192 if (jacLowerBound < 1.0e-16 || fabs(val) > jacLowerBound || colI == rowI)
196 MatSetValue(jacMat, colI, rowI, val, INSERT_VALUES);
200 MatSetValue(jacMat, rowI, colI, val, INSERT_VALUES);
206 VecRestoreArrayRead(resVec, &resVecArray);
207 VecRestoreArrayRead(coloredColumn, &coloredColumnArray);
223 VecCreate(PETSC_COMM_WORLD, normStatePerturbVec);
224 VecSetSizes(*normStatePerturbVec, localSize, PETSC_DETERMINE);
225 VecSetFromOptions(*normStatePerturbVec);
226 VecSet(*normStatePerturbVec, 1.0);
228 dictionary normStateDict =
allOptions_.subDict(
"normalizeStates");
230 wordList normStateNames = normStateDict.toc();
234 word stateName =
stateInfo_[
"volVectorStates"][idxI];
235 if (normStateNames.found(stateName))
237 scalar scale = normStateDict.getScalar(stateName);
238 PetscScalar scaleValue = 0.0;
242 for (label comp = 0; comp < 3; comp++)
245 VecSetValue(*normStatePerturbVec, glbIdx, scaleValue, INSERT_VALUES);
253 const word stateName =
stateInfo_[
"volScalarStates"][idxI];
254 if (normStateNames.found(stateName))
256 scalar scale = normStateDict.getScalar(stateName);
257 PetscScalar scaleValue = 0.0;
262 VecSetValue(*normStatePerturbVec, glbIdx, scaleValue, INSERT_VALUES);
269 const word stateName =
stateInfo_[
"modelStates"][idxI];
270 if (normStateNames.found(stateName))
272 scalar scale = normStateDict.getScalar(stateName);
273 PetscScalar scaleValue = 0.0;
278 VecSetValue(*normStatePerturbVec, glbIdx, scaleValue, INSERT_VALUES);
285 const word stateName =
stateInfo_[
"surfaceScalarStates"][idxI];
286 if (normStateNames.found(stateName))
288 scalar scale = normStateDict.getScalar(stateName);
289 PetscScalar scaleValue = 0.0;
295 scale =
mesh_.magSf()[faceI];
303 scale =
mesh_.magSf().boundaryField()[patchIdx][faceIdx];
308 VecSetValue(*normStatePerturbVec, glbIdx, scaleValue, INSERT_VALUES);
313 VecAssemblyBegin(*normStatePerturbVec);
314 VecAssemblyEnd(*normStatePerturbVec);
318 const dictionary& options,
329 label transposed = options.getLabel(
"transposed");
342 MatSetFromOptions(jacMat);
346 MatZeroEntries(jacMat);
347 Info <<
"Partial derivative matrix created. " <<
mesh_.time().elapsedCpuTime() <<
" s" << endl;
351 const dictionary& options,
376 label transposed = options.getLabel(
"transposed");
380 VecDuplicate(wVec, &coloredColumn);
381 VecZeroEntries(coloredColumn);
386 MatZeroEntries(jacMat);
389 VecDuplicate(wVec, &wVecNew);
390 VecCopy(wVec, wVecNew);
393 Vec resVecRef, resVec;
394 VecDuplicate(wVec, &resVec);
395 VecDuplicate(wVec, &resVecRef);
396 VecZeroEntries(resVec);
397 VecZeroEntries(resVecRef);
400 Vec normStatePerturbVec;
404 mOptions.set(
"updateState", 1);
405 mOptions.set(
"updateMesh", 0);
406 mOptions.set(
"setResVec", 1);
407 mOptions.set(
"isPC", options.getLabel(
"isPC"));
410 scalar jacLowerBound = options.getScalar(
"lowerBound");
413 scalar rDelta = 1.0 / delta;
414 PetscScalar rDeltaValue = 0.0;
422 partDerivName +=
"T";
424 if (options.getLabel(
"isPC"))
426 partDerivName +=
"PC";
430 for (label color = 0; color < nColors; color++)
432 scalar eTime =
mesh_.time().elapsedCpuTime();
434 if (color % printInterval == 0 or color == nColors - 1)
436 Info << partDerivName <<
": " << color <<
" of " << nColors
437 <<
", ExecutionTime: " << eTime <<
" s" << endl;
452 VecCopy(wVec, wVecNew);
455 VecAXPY(resVec, -1.0, resVecRef);
456 VecScale(resVec, rDeltaValue);
460 this->
setPartDerivMat(resVec, coloredColumn, transposed, jacMat, jacLowerBound);
466 MatAssemblyBegin(jacMat, MAT_FINAL_ASSEMBLY);
467 MatAssemblyEnd(jacMat, MAT_FINAL_ASSEMBLY);