/[escript]/trunk/paso/src/FCTSolver.c
ViewVC logotype

Diff of /trunk/paso/src/FCTSolver.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 3014 by gross, Wed Apr 28 04:05:21 2010 UTC revision 3020 by gross, Tue May 4 09:10:03 2010 UTC
# Line 112  double Paso_FCTSolver_getSafeTimeStepSiz Line 112  double Paso_FCTSolver_getSafeTimeStepSiz
112  {  {
113     dim_t i, n;     dim_t i, n;
114     double dt_max=LARGE_POSITIVE_FLOAT, dt_max_loc;     double dt_max=LARGE_POSITIVE_FLOAT, dt_max_loc;
115     register double l_ii,m;     register double l_ii,m_i;
116       index_t fail=0, fail_loc;
117     n=Paso_SystemMatrix_getTotalNumRows(fctp->transport_matrix);     n=Paso_SystemMatrix_getTotalNumRows(fctp->transport_matrix);
   
   
118     /* set low order transport operator */     /* set low order transport operator */
119     Paso_FCTSolver_setLowOrderOperator(fctp);     Paso_FCTSolver_setLowOrderOperator(fctp);
120                        
# Line 124  double Paso_FCTSolver_getSafeTimeStepSiz Line 123  double Paso_FCTSolver_getSafeTimeStepSiz
123           *  calculate time step size:                                                     *  calculate time step size:                                          
124          */          */
125          dt_max=LARGE_POSITIVE_FLOAT;          dt_max=LARGE_POSITIVE_FLOAT;
126          #pragma omp parallel private(dt_max_loc)      fail=0;
127            #pragma omp parallel private(dt_max_loc, fail_loc)
128          {          {
129                 dt_max_loc=LARGE_POSITIVE_FLOAT;                 dt_max_loc=LARGE_POSITIVE_FLOAT;
130                 #pragma omp for schedule(static) private(i,l_ii,m)  
131               fail_loc=0;
132                   #pragma omp for schedule(static) private(i,l_ii,m_i)
133                 for (i=0;i<n;++i) {                 for (i=0;i<n;++i) {
134                    l_ii=fctp->main_diagonal_low_order_transport_matrix[i];                    l_ii=fctp->main_diagonal_low_order_transport_matrix[i];
135                    m=fctp->lumped_mass_matrix[i];                    m_i=fctp->lumped_mass_matrix[i];
136                    if ( (l_ii<0 && m>0.) || (l_ii>0 && m<0) ) {            if ( (m_i > 0) && (l_ii < 0 ) ) {
137                       dt_max_loc=MIN(dt_max_loc,-m/l_ii);                dt_max_loc=MIN(dt_max_loc,-m_i/l_ii);
138                    }            } else {
139                  fail_loc=-1;
140              }
141                 }                 }
142                 #pragma omp critical                 #pragma omp critical
143                 {                 {
144                    dt_max=MIN(dt_max,dt_max_loc);                    dt_max=MIN(dt_max,dt_max_loc);
145              fail=MIN(fail, fail_loc);
146                 }                 }
147          }          }
148          #ifdef PASO_MPI          #ifdef PASO_MPI
149                 dt_max_loc = dt_max;          {
150                 MPI_Allreduce(&dt_max_loc, &dt_max, 1, MPI_DOUBLE, MPI_MIN, fctp->mpi_info->comm);             double rtmp_loc[2], rtmp[2];
151                   rtmp_loc[0]=dt_max;
152               rtmp_loc[1]= (double) fail;
153                   MPI_Allreduce(rtmp_loc, rtmp, 2, MPI_DOUBLE, MPI_MIN, fctp->mpi_info->comm);
154               dt_max=rtmp[0];
155               fail = rtmp[1] < 0 ? -1 : 0;
156        }
157          #endif          #endif
158      if (dt_max<LARGE_POSITIVE_FLOAT) dt_max*=fctp->dt_factor;          if (fail < 0 ) {
159           Paso_setError(VALUE_ERROR, "Paso_FCTSolver_getSafeTimeStepSize: negative mass or positive diffusion term detected.");
160           return -1;
161        } else {
162            if (dt_max<LARGE_POSITIVE_FLOAT) dt_max*=fctp->dt_factor;
163        }
164     }     }
165     return dt_max;     return dt_max;
166  }  }

Legend:
Removed from v.3014  
changed lines
  Added in v.3020

  ViewVC Help
Powered by ViewVC 1.1.26