Beispiel #1
0
static void gfs_init_wave_class_init (GfsGenericInitClass * klass)
{
  GFS_EVENT_CLASS (klass)->event = gfs_init_wave_event;
  GTS_OBJECT_CLASS (klass)->read = gfs_init_wave_read;
  GTS_OBJECT_CLASS (klass)->write = gfs_init_wave_write;
  GTS_OBJECT_CLASS (klass)->destroy = gfs_init_wave_destroy;
}
Beispiel #2
0
static void output_spectra_class_init (GtsObjectClass * klass)
{
  GFS_EVENT_CLASS (klass)->event = output_spectra_event;
  klass->read =  output_spectra_read;
  klass->write = output_spectra_write;
  klass->destroy = output_spectra_destroy;
}
Beispiel #3
0
static gboolean output_spectra_event (GfsEvent * event, 
				      GfsSimulation * sim) 
{
  if ((* GFS_EVENT_CLASS (GTS_OBJECT_CLASS (gfs_output_spectra_class ())->parent_class)->event)
      (event, sim)) {
    GfsDomain * domain = GFS_DOMAIN (sim);
    GfsOutputSpectra * v = GFS_OUTPUT_SPECTRA (event);
    fftw_plan p;
    Datawrite data;

    data.fp  = GFS_OUTPUT (event)->file->fp;
    data.L   = v->L;
    data.kmax = init_kmax(v->L);
    data.dir1 = v->dir[0];
    data.dir2 = v->dir[1];

    fill_cartesian_matrix( v->cgd, v->v, domain);
    switch (v->Ndim) {
      case 1: {
	data.n1 = ( v->cgd->n[v->dir[0]] / 2 ) + 1;
	data.out = fftw_malloc( sizeof(fftw_complex)*data.n1 );
	p = fftw_plan_dft_r2c_1d( v->cgd->n[v->dir[0]], v->cgd->v, data.out, FFTW_ESTIMATE);
	fftw_execute(p);
	write_spectra_1D ( &data );
	break;
      }
      case 2: {
	data.n1 = v->cgd->n[v->dir[0]];
	data.n2 = ( v->cgd->n[v->dir[1]] / 2 ) + 1;
	data.out = fftw_malloc( sizeof(fftw_complex)*v->cgd->n[v->dir[0]]*data.n2 );
	p = fftw_plan_dft_r2c_2d( v->cgd->n[v->dir[0]], v->cgd->n[v->dir[1]], 
				  v->cgd->v, data.out, FFTW_ESTIMATE);
	fftw_execute(p); 
	write_spectra_2D ( &data );
	break;
      }
    case 3: {
      data.n1 = v->cgd->n[0];
      data.n2 = v->cgd->n[1];
      data.n3 = ( v->cgd->n[2] / 2 ) + 1;
      data.out = fftw_malloc( sizeof(fftw_complex)*v->cgd->n[0]*v->cgd->n[1]*data.n3 );
      p = fftw_plan_dft_r2c_3d( v->cgd->n[0], v->cgd->n[1], v->cgd->n[2], 
				v->cgd->v, data.out, FFTW_ESTIMATE);
      fftw_execute(p); 
      write_spectra_3D ( &data );
      break;
    }
    default:
      g_assert_not_reached ();
    }
    
    fftw_destroy_plan(p);
    fftw_free ( data.out );

    return TRUE;
  }
  return FALSE;
}
Beispiel #4
0
static void gfs_source_darcy_class_init (GfsSourceGenericClass * klass)
{
  /* define new methods and overload inherited methods here */

  GFS_EVENT_CLASS (klass)->event = gfs_source_darcy_event;
  printf("\ndarcy init\n");
  GTS_OBJECT_CLASS (klass)->read = gfs_source_darcy_read;
  printf("\ndarcy read\n");
  GTS_OBJECT_CLASS (klass)->write = gfs_source_darcy_write;
  printf("\ndarcy written\n");
  GTS_OBJECT_CLASS (klass)->destroy = gfs_source_darcy_destroy;
}
Beispiel #5
0
static gboolean gfs_init_wave_event (GfsEvent * event, GfsSimulation * sim)
{
  if ((* GFS_EVENT_CLASS (GTS_OBJECT_CLASS (gfs_init_wave_class ())->parent_class)->event) 
      (event, sim)) {
    gfs_catch_floating_point_exceptions ();
    gfs_domain_cell_traverse (GFS_DOMAIN (sim), FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
			      (FttCellTraverseFunc) init_energy, event);
    gfs_restore_fpe_for_function (GFS_INIT_WAVE (event)->d);
    gfs_catch_floating_point_exceptions ();
    gfs_domain_cell_traverse (GFS_DOMAIN (sim), FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
			      (FttCellTraverseFunc) scale_energy, event);
    gfs_restore_fpe_for_function (GFS_INIT_WAVE (event)->hs);
    return TRUE;
  }
  return FALSE;
}
Beispiel #6
0
static gboolean gfs_init_face_values_event (GfsEvent * event, GfsSimulation * sim)
{
  if ((* GFS_EVENT_CLASS (GTS_OBJECT_CLASS (gfs_init_face_values_class ())->parent_class)->event) 
      (event, sim)) {
    GSList * i = GFS_INIT (event)->f;
    while (i) {
      VarFunc * vf = i->data;
      FaceInitData data;
      FttComponent c = FTT_DIMENSION;
      if (!strcmp (vf->v[0]->name, "U")) {
	if (vf->n > 1)
	  g_assert_not_implemented ();
        data.v1 = GFS_SKEW_SYMMETRIC(sim)->velfaces[0];
        data.v2 = GFS_SKEW_SYMMETRIC(sim)->velfaces[1];
        data.f  = vf->f[0];
        c  = FTT_X;
      }
      else if (!strcmp (vf->v[0]->name, "V")) {
        data.v1 = GFS_SKEW_SYMMETRIC(sim)->velfaces[2];
        data.v2 = GFS_SKEW_SYMMETRIC(sim)->velfaces[3];
        data.f  = vf->f[0];
        c  = FTT_Y;
      }
#if (!FTT_2D)
      else if (!strcmp (vf->v[0]->name, "W")) {
        data.v1 = GFS_SKEW_SYMMETRIC(sim)->velfaces[4];
        data.v2 = GFS_SKEW_SYMMETRIC(sim)->velfaces[5];
        data.f  = vf->f[0];
        c  = FTT_Z;
      }
#endif
      if (c < FTT_DIMENSION) {
	gfs_catch_floating_point_exceptions ();
	gfs_domain_face_traverse (GFS_DOMAIN (sim), c,
				  FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1, 
				  (FttFaceTraverseFunc) init_fd, &data);
	gfs_restore_fpe_for_function (vf->f[0]);
      }
      i = i->next;
    }
    return TRUE;
  }
  return FALSE;
}
Beispiel #7
0
static gboolean gfs_init_stokes_wave_event (GfsEvent * event, GfsSimulation * sim)
{
  if ((* GFS_EVENT_CLASS (GTS_OBJECT_CLASS (gfs_init_stokes_wave_class ())->parent_class)->event) 
      (event, sim)) {
    GfsVariable ** velocity = gfs_domain_velocity (GFS_DOMAIN (sim));
    GfsVariable * t = gfs_variable_from_name (GFS_DOMAIN (sim)->variables, "T");
    g_assert (velocity);
    g_assert (t);
    gfs_domain_cell_traverse (GFS_DOMAIN (sim), FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
			      (FttCellTraverseFunc) init_velocity, velocity);
    GfsSurface * surface = GFS_SURFACE (gts_object_new (GTS_OBJECT_CLASS (gfs_surface_class ())));
    surface->f = gfs_function_spatial_new (gfs_function_spatial_class (), stokes_height);
    gfs_object_simulation_set (surface->f, sim);
    gfs_domain_init_fraction (GFS_DOMAIN (sim), GFS_GENERIC_SURFACE (surface), t);
    gts_object_destroy (GTS_OBJECT (surface));
    return TRUE;
  }
  return FALSE;
}
Beispiel #8
0
static gboolean gfs_source_darcy_event (GfsEvent * event, GfsSimulation * sim)
{
  if ((* GFS_EVENT_CLASS (GTS_OBJECT_CLASS (gfs_source_darcy_class ())->parent_class)->event) (event, sim)) {
    /* do object-specific event here */
    if (GFS_SOURCE_DARCY (event)->beta < 1.) {
      gfs_catch_floating_point_exceptions ();
      gfs_domain_traverse_layers (GFS_DOMAIN (sim), (FttCellTraverseFunc) save_darcy, event);
      if (gfs_restore_floating_point_exceptions ()) {
	GfsSourceDarcy * c = GFS_SOURCE_DARCY (event);
	gchar * s = g_strconcat ("\n", gfs_function_description (c->darcycoeff, FALSE), NULL);
	if (c->forchhicoeff)
	  s = g_strconcat (s, "\n", gfs_function_description (c->forchhicoeff, FALSE), NULL);
	/* fixme: memory leaks */
	g_message ("floating-point exception in user-defined function(s):%s", s);
	exit (1);
      }
    }			  
   return TRUE;			      
  }
  return FALSE;
}
Beispiel #9
0
static void gfs_init_face_values_class_init (GfsGenericInitClass * klass)
{
  GFS_EVENT_CLASS (klass)->event = gfs_init_face_values_event;
}