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; }
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; }
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; }
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; }
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; }
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; }
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; }
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; }
static void gfs_init_face_values_class_init (GfsGenericInitClass * klass) { GFS_EVENT_CLASS (klass)->event = gfs_init_face_values_event; }