renormvec.c
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 static char const Id[] = "$Id: renormvec.c 2962 2010-02-04 19:50:44Z scholz $\n\n";
00025 static char const Td[] = "$Today: " __FILE__ " " __DATE__ " " __TIME__ " $\n\n";
00026
00027 #include "util.h"
00028
00029 PetscReal RenormVec(Vec v, PetscReal normset, PetscReal normtol, int dim)
00030 {
00031 MagparFunctionInfoBegin;
00032
00033 int t_vlen;
00034 ierr = VecGetLocalSize(v,(PetscInt*)&t_vlen);CHKERRQ(ierr);
00035 assert(t_vlen%dim==0);
00036
00037 PetscReal *ta_v;
00038 ierr = VecGetArray(v,&ta_v);CHKERRQ(ierr);
00039
00040 assert(dim==ND);
00041
00042 PetscReal normmax,normmin;
00043 normmax=0;
00044 normmin=PETSC_MAX;
00045 for (int i=0;i<t_vlen/dim;i++) {
00046 PetscReal nrm;
00047 nrm=my_dnrm2(dim,ta_v+dim*i,1);
00048 normmax=PetscMax(normmax,nrm);
00049 normmin=PetscMin(normmin,nrm);
00050 }
00051
00052 PetscReal gnormmax,gnormmin;
00053 ierr = PetscGlobalMax(&normmax,&gnormmax,PETSC_COMM_WORLD);CHKERRQ(ierr);
00054 ierr = PetscGlobalMin(&normmin,&gnormmin,PETSC_COMM_WORLD);CHKERRQ(ierr);
00055
00056 PetscReal normdev;
00057 normdev = PetscMax(PetscAbsReal(gnormmax-normset),
00058 PetscAbsReal(gnormmin-normset));
00059
00060
00061 if (PetscAbsReal(normdev) > normtol) {
00062 for (int i=0;i<t_vlen/dim;i++) {
00063
00064 PetscReal nrm;
00065 nrm=my_dnrm2(dim,ta_v+dim*i,1);
00066
00067
00068 if (nrm>D_EPS) {
00069 my_dscal(dim,normset/nrm,ta_v+dim*i,1);
00070 }
00071
00072
00073
00074
00075
00076
00077
00078 else {
00079 ta_v[dim*i+0]=0.0;
00080 ta_v[dim*i+1]=0.0;
00081 ta_v[dim*i+2]=1.0;
00082 }
00083 }
00084 }
00085
00086 VecRestoreArray(v,&ta_v);
00087
00088 MagparFunctionInfoReturn(normdev);
00089 }
00090