72 {
73 PetscViewer viewer = vf->viewer;
74 Vec res;
75 DM dm;
76 PetscSection s;
78 PetscReal *lnorms, *norms;
79 PetscInt numFields,
f, pStart, pEnd,
p;
80
84
85 PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 4);
86 CHKERR SNESGetFunction(snes, &res, 0, 0);
87 CHKERR SNESGetDM(snes, &dm);
88 CHKERR DMGetDefaultSection(dm, &s);
89 CHKERR PetscSectionGetNumFields(s, &numFields);
90 CHKERR PetscSectionGetChart(s, &pStart, &pEnd);
91 CHKERR PetscCalloc2(numFields, &lnorms, numFields, &norms);
92 CHKERR VecGetArrayRead(res, &r);
93 for (
p = pStart;
p < pEnd; ++
p) {
94 for (f = 0;
f < numFields; ++
f) {
95 PetscInt fdof, foff,
d;
96
97 CHKERR PetscSectionGetFieldDof(s,
p, f, &fdof);
98 CHKERR PetscSectionGetFieldOffset(s,
p, f, &foff);
99 for (d = 0;
d < fdof; ++
d)
100 lnorms[f] += PetscRealPart(PetscSqr(r[foff + d]));
101 }
102 }
103 CHKERR VecRestoreArrayRead(res, &r);
104 CHKERR MPIU_Allreduce(lnorms, norms, numFields, MPIU_REAL, MPIU_SUM,
105 PetscObjectComm((PetscObject)dm));
106 CHKERR PetscViewerPushFormat(viewer, vf->format);
107 CHKERR PetscViewerASCIIAddTab(viewer, ((PetscObject)snes)->tablevel);
108 CHKERR PetscViewerASCIIPrintf(viewer,
"%3D SNES Function norm %14.12e\n", its,
109 (double)fgnorm);
110 for (f = 0;
f < numFields; ++
f) {
114 (double)PetscSqrtReal(norms[f]));
115 }
116 CHKERR PetscViewerASCIISubtractTab(viewer, ((PetscObject)snes)->tablevel);
117 CHKERR PetscViewerPopFormat(viewer);
118 CHKERR PetscFree2(lnorms, norms);
119
122}
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
static LoggerType & setLog(const std::string channel)
Set ans resset chanel logger.
#define MOFEM_LOG_TAG(channel, tag)
Tag channel.
constexpr auto field_name