Пример #1
0
void hart_init() {
    int i;
    char filename[256], filename2[256];
    const char *tmp;
    const char *path;

    tmp = extract_option1("initial-conditions-path","ics",NULL);
    if(tmp != NULL) {
        path = tmp;
    } else {
        path = output_directory;
    }

    /*
    //  No more options are allowed.
     */
    if(num_options > 0) {
        cart_error("Unrecognized option: %s",options[0]);
    }

#ifdef PARTICLES
    sprintf( filename, "%s/PMcrd.DAT", path );
    sprintf( filename2, "%s/PMcrs0.DAT", path );

    restart_load_balance_cart( NULL, filename, filename2 );

    read_cart_particles( filename, filename2, NULL, NULL, 0, NULL );
    cart_debug("read in particles");
#endif

#ifdef HYDRO
    sprintf( filename, "%s/tr_ic.dat", path );
    read_hart_gas_ic(filename);
    cart_debug("read in gas");
#endif /* HYDRO */

    units_init();
    units_update( min_level );

    cart_debug("tl[min_level] = %f", tl[min_level] );
    cart_debug(" a[min_level] = %f", auni[min_level] );

#ifdef HYDRO
    hydro_magic( min_level );
    hydro_eos( min_level );
#endif /* HYDRO */

#ifdef PARTICLES
    build_mesh();

#ifdef STARFORM
    for ( i = 0; i < nDim; i++ ) {
        star_formation_volume_min[i] = refinement_volume_min[i];
        star_formation_volume_max[i] = refinement_volume_max[i];
    }
#endif /* STARFORM */

#else
    for ( i = 0; i < nDim; i++ ) {
        refinement_volume_min[i] = 0;
        refinement_volume_max[i] = (double)num_grid;
    }
#endif /* PARTICLES */

#ifdef HYDRO_TRACERS
    set_hydro_tracers_to_particles();
#endif /* HYDRO_TRACERS */

    if ( !buffer_enabled ) {
        cart_debug("building cell buffer");
        build_cell_buffer();
        repair_neighbors();
    }

#ifdef DEBUG
    check_map();
#endif /* DEBUG */
}
bool ESceneObjectTool::ExportBreakableObjects(SExportStreams* F)
{
	bool bResult = true;
    CGeomPartExtractor* extractor=0;

    Fbox 		bb;
    if (!GetBox(bb)) return false;

    extractor	= xr_new<CGeomPartExtractor>();
    extractor->Initialize(bb,EPS_L,2);

    UI->SetStatus	("Export breakable objects...");
	// collect verts&&faces
    {
	    SPBItem* pb = UI->ProgressStart(m_Objects.size(),"Prepare geometry...");
        for (ObjectIt it=m_Objects.begin(); it!=m_Objects.end(); it++){
	        pb->Inc();
            CSceneObject* obj 		= dynamic_cast<CSceneObject*>(*it); VERIFY(obj);
            if (obj->IsStatic()){
                CEditableObject *O 	= obj->GetReference();
                const Fmatrix& T 	= obj->_Transform();
                for(EditMeshIt M=O->FirstMesh();M!=O->LastMesh();M++)
                    if (!build_mesh	(T,*M,extractor,SGameMtl::flBreakable,FALSE)){bResult=false;break;}
            }
        }
	    UI->ProgressEnd(pb);
    }
    if (!extractor->Process())		bResult = false;
    // export parts
    if (bResult){
    	SBPartVec& parts			= extractor->GetParts();
	    SPBItem* pb = UI->ProgressStart(parts.size(),"Export Parts...");
        for (SBPartVecIt p_it=parts.begin(); p_it!=parts.end(); p_it++){
	        pb->Inc();
            SBPart*	P				= *p_it;
        	if (P->Valid()){
                // export visual
                AnsiString sn		= AnsiString().sprintf("meshes\\brkbl#%d.ogf",(p_it-parts.begin()));
                xr_string fn		= Scene->LevelPath()+sn.c_str();
                IWriter* W			= FS.w_open(fn.c_str()); R_ASSERT(W);
                if (!P->Export(*W,1)){
                    ELog.DlgMsg		(mtError,"Invalid breakable object.");
                    bResult 		= false;
                    break;
                }
                FS.w_close			(W);
                // export spawn object
                {
                    AnsiString entity_ref		= "breakable_object";
                    ISE_Abstract*	m_Data		= create_entity(entity_ref.c_str()); 	VERIFY(m_Data);
                    CSE_Visual* m_Visual		= m_Data->visual();	VERIFY(m_Visual);
                    // set params
                    m_Data->set_name			(entity_ref.c_str());
                    m_Data->set_name_replace	(sn.c_str());
                    m_Data->position().set		(P->m_RefOffset);
                    m_Data->angle().set			(P->m_RefRotate);
                    m_Visual->set_visual		(sn.c_str(),false);

					if (s_draw_dbg){
                        Fmatrix MX;
                        MX.setXYZi				(P->m_RefRotate);
                        MX.translate_over		(P->m_RefOffset);
                        Fvector DR				= {0,0,1};
                        MX.transform_dir		(DR);
                        Tools->m_DebugDraw.AppendLine(P->m_RefOffset,Fvector().mad(P->m_RefOffset,MX.k,1.f),0xFF0000FF,false,false);
                    }

                    NET_Packet					Packet;
                    m_Data->Spawn_Write			(Packet,TRUE);

                    F->spawn.stream.open_chunk	(F->spawn.chunk++);
                    F->spawn.stream.w			(Packet.B.data,Packet.B.count);
                    F->spawn.stream.close_chunk	();
                    destroy_entity				(m_Data);
                }
            }else{
            	ELog.Msg(mtError,"Can't export invalid part #%d",p_it-parts.begin());
            }
        }
	    UI->ProgressEnd(pb);
    }
    // clean up
    xr_delete(extractor);

    return bResult;
}
bool ESceneObjectTool::ExportClimableObjects(SExportStreams* F)
{
	bool bResult                    = true;
    CGeomPartExtractor* extractor   = 0;

    Fbox 		bb;
    if (!GetBox(bb))
        return  false;

    extractor	                    = xr_new<CGeomPartExtractor>();
    extractor->Initialize           (bb,EPS_L,int_max);

    UI->SetStatus	("Export climable objects...");
	// collect verts&&faces
    {
	    SPBItem* pb                 = UI->ProgressStart(m_Objects.size(), "Prepare geometry...");
        for (ObjectIt it=m_Objects.begin(); it!=m_Objects.end(); it++)
        {
	        pb->Inc();
            CSceneObject* obj 		= dynamic_cast<CSceneObject*>(*it);
            VERIFY                  (obj);
            if (obj->IsStatic())
            {
                CEditableObject *O 	= obj->GetReference();
                const Fmatrix& T 	= obj->_Transform();
                
                for(EditMeshIt M =O->FirstMesh(); M!=O->LastMesh(); M++)
                    if (!build_mesh	(T, *M, extractor, SGameMtl::flClimable, TRUE))
                    {
                      bResult       = false;
                      break;
                    }
            }
        }
	    UI->ProgressEnd(pb);
    }
    if (!extractor->Process())
        bResult                     = false;

    // export parts
    if (bResult)
    {
    	SBPartVec& parts			= extractor->GetParts();
	    SPBItem* pb                 = UI->ProgressStart(parts.size(),"Export Parts...");
        for (SBPartVecIt p_it=parts.begin(); p_it!=parts.end(); p_it++)
        {
	        pb->Inc                 ();
            SBPart*	P				= *p_it;
        	if (P->Valid())
            {
                // export visual
                AnsiString sn		            = AnsiString().sprintf("clmbl#%d",(p_it-parts.begin()));

				Fvector local_normal	        = {0,0,0};

                LPCSTR mat_name = NULL;
                for (SBFaceVecIt it=P->m_Faces.begin(); it!=P->m_Faces.end(); it++)
                {
                	for (u32 k=0; k<3; k++)
                        local_normal.add	        ((*it)->n[k]);

                    mat_name     = (*it)->surf->_GameMtlName();
                }

                local_normal.normalize_safe		();
                
                // export spawn object
                {
                    AnsiString entity_ref		= "climable_object";
                    ISE_Abstract*	m_Data		= create_entity(entity_ref.c_str()); 	VERIFY(m_Data);
                    ISE_Shape* m_Shape			= m_Data->shape();                      VERIFY(m_Shape);
//					CSE_Visual* m_Visual		= m_Data->visual();	VERIFY(m_Visual);
                    // set params
                    m_Data->set_name			(entity_ref.c_str());
                    m_Data->set_name_replace	(sn.c_str());
                    // set shape
                    CShapeData::shape_def		shape;
                    shape.type					= CShapeData::cfBox;
                    shape.data.box.scale		((P->m_BBox.max.x-P->m_BBox.min.x)*0.5f,
                    							(P->m_BBox.max.y-P->m_BBox.min.y)*0.5f,
                                                (P->m_BBox.max.z-P->m_BBox.min.z)*0.5f);
                    m_Shape->assign_shapes		(&shape,1);
					// orientate object
	          		if (!OrientToNorm(local_normal,P->m_OBB.m_rotate,P->m_OBB.m_halfsize))
                    {
                    	ELog.Msg(mtError,"Invalid climable object found. [%3.2f, %3.2f, %3.2f]",VPUSH(P->m_RefOffset));
					}
                    else
                    {
                        Fmatrix M; M.set			(P->m_OBB.m_rotate.i,P->m_OBB.m_rotate.j,P->m_OBB.m_rotate.k,P->m_OBB.m_translate);
                        M.getXYZ					(P->m_RefRotate); // не i потому что в движке так
                        m_Data->position().set		(P->m_RefOffset); 
                        m_Data->angle().set			(P->m_RefRotate);

                        m_Data->set_additional_info((void*)mat_name);
                        NET_Packet					Packet;
                        m_Data->Spawn_Write			(Packet,TRUE);

                        F->spawn.stream.open_chunk	(F->spawn.chunk++);
                        F->spawn.stream.w			(Packet.B.data,Packet.B.count);
                        F->spawn.stream.close_chunk	();

						if (s_draw_dbg)
                        {
                            Tools->m_DebugDraw.AppendOBB(P->m_OBB);
                            M.transform_dir				(local_normal);
                            Tools->m_DebugDraw.AppendLine(P->m_RefOffset,Fvector().mad(P->m_RefOffset,local_normal,1.f));
                        }
                    }
                    destroy_entity				(m_Data);
                }
            }else
            {
            	ELog.Msg(mtError,"Can't export invalid part #%d",p_it-parts.begin());
            }
        }
	    UI->ProgressEnd     (pb);
    }
    // clean up
    xr_delete               (extractor);

    return                  bResult;
}
Пример #4
0
main() {
	bool flat = false;
	//int *low, *high;
	vector_t light;

	surface_t screen;

	// this is a vector buffer, for the transformations
	// our only object have 5 vertexes, but we'll make space for 32 anyway
	vector_t *pbuffer;

	// off-screen surface buffer
	//u_char* sbuffer = (u_char*)malloc(MODE2_MAX);

	// our solid :)
	object_t triangle;


	heapinit (HPSIZE);
	
	pbuffer = newa(vector_t, 32);

	triangle.mesh = build_mesh();
	triangle.rot_x = triangle.rot_y = triangle.rot_z = 0;
	triangle.trans_x = triangle.trans_y = 0;
	triangle.trans_z = i2f(30);	// remember: we are using fixed-point numbers

	screen.data.ram = sbuffer;

	// polygon rendering buffers
	//low = newa(int, MODE2_HEIGHT);
	//high = newa(int, MODE2_HEIGHT);

	// light source
	light.x = light.y = light.z = i2f(1);
	vector_normalize(&light, &light);

	printf("spinning solid demo\n\n");

	printf("instructions:\n   press [UP] to toggle flat shading\n\n");

	printf("creating look-up tables, please wait\n");
	create_lookup_tables();

	// set screen to graphic mode
	set_color(15, 1, 1);
	set_mode(mode_2);
	fill(MODE2_ATTR, 0xF1, MODE2_MAX);

	//surface_line(&screen, 0, 0, 0, 0); // FIXME: won't compile without this crap

	while (!get_trigger(0)) {
		if (get_stick(0) == 1)
			flat = !flat;

		// rotate a bit
		triangle.rot_y += 2;
		triangle.rot_x += 3;
		triangle.rot_z += 1;

		// clear the off-screen buffer
		memset(sbuffer, 0, MODE2_MAX);	// [*] 

	//surface_line(screen, 0, 0, 10, 10);

		// render the object
		if (flat)
			//object_render_flatshading(&screen, &triangle, pbuffer, low, high, &light);
			object_render_flatshading(&screen, &triangle, pbuffer, stencil, &light);
		else
			object_render_wireframe(&screen, &triangle, pbuffer);

		// show the off-screen buffer
		//vwrite(screen.data.ram, 0, MODE2_MAX); // [*]
		msx_vwrite_direct(screen.data.ram, 0, MODE2_MAX);

		// [*] FIXME: there will be better ways of doing this (soon)
	}

	// go back to text mode
	set_mode(mode_0);

	// deallocate stuff

	mesh_delete(triangle.mesh);
	//free(sbuffer);
	//free(low);
	//free(high);
	//destroy_lookup_tables();
}
Пример #5
0
Interaction<number>::Interaction() {
	F1_A[0] = HYDR_A;
	F1_A[1] = STCK_A;

	F1_RC[0] = HYDR_RC;
	F1_RC[1] = STCK_RC;
	
	F1_R0[0] = HYDR_R0;
	F1_R0[1] = STCK_R0;
	
	F1_BLOW[0] = HYDR_BLOW;
	F1_BLOW[1] = STCK_BLOW;
	
	F1_BHIGH[0] = HYDR_BHIGH;
	F1_BHIGH[1] = STCK_BHIGH;
	
	F1_RLOW[0] = HYDR_RLOW;
	F1_RLOW[1] = STCK_RLOW;
	
	F1_RHIGH[0] = HYDR_RHIGH;
	F1_RHIGH[1] = STCK_RHIGH;
	
	F1_RCLOW[0] = HYDR_RCLOW;
	F1_RCLOW[1] = STCK_RCLOW;
	
	F1_RCHIGH[0] = HYDR_RCHIGH;
	F1_RCHIGH[1] = STCK_RCHIGH;
	
	F2_K[0] = CRST_K;
	F2_K[1] = CXST_K;

	F2_RC[0] = CRST_RC;
	F2_RC[1] = CXST_RC;
	
	F2_R0[0] = CRST_R0;
	F2_R0[1] = CXST_R0;
	
	F2_BLOW[0] = CRST_BLOW;
	F2_BLOW[1] = CXST_BLOW;
	
	F2_BHIGH[0] = CRST_BHIGH;
	F2_BHIGH[1] = CXST_BHIGH;
	
	F2_RLOW[0] = CRST_RLOW;
	F2_RLOW[1] = CXST_RLOW;
	
	F2_RHIGH[0] = CRST_RHIGH;
	F2_RHIGH[1] = CXST_RHIGH;
	
	F2_RCLOW[0] = CRST_RCLOW;
	F2_RCLOW[1] = CXST_RCLOW;
	
	F2_RCHIGH[0] = CRST_RCHIGH;
	F2_RCHIGH[1] = CXST_RCHIGH;
	
	F4_THETA_A[0] = STCK_THETA4_A;
	F4_THETA_A[1] = STCK_THETA5_A;

	F4_THETA_A[2] = HYDR_THETA1_A;
	F4_THETA_A[3] = HYDR_THETA2_A;
	F4_THETA_A[4] = HYDR_THETA4_A;
	F4_THETA_A[5] = HYDR_THETA7_A;
	
	F4_THETA_A[6] = CRST_THETA1_A;
	F4_THETA_A[7]= CRST_THETA2_A;
	F4_THETA_A[8] = CRST_THETA4_A;
	F4_THETA_A[9] = CRST_THETA7_A;

	F4_THETA_A[10] = CXST_THETA1_A;
	F4_THETA_A[11] = CXST_THETA4_A;
	F4_THETA_A[12] = CXST_THETA5_A;
	
	F4_THETA_B[0] = STCK_THETA4_B;
	F4_THETA_B[1] = STCK_THETA5_B;

	F4_THETA_B[2] = HYDR_THETA1_B;
	F4_THETA_B[3] = HYDR_THETA2_B;
	F4_THETA_B[4] = HYDR_THETA4_B;
	F4_THETA_B[5] = HYDR_THETA7_B;
	
	F4_THETA_B[6] = CRST_THETA1_B;
	F4_THETA_B[7] = CRST_THETA2_B;
	F4_THETA_B[8] = CRST_THETA4_B;
	F4_THETA_B[9] = CRST_THETA7_B;

	F4_THETA_B[10] = CXST_THETA1_B;
	F4_THETA_B[11] = CXST_THETA4_B;
	F4_THETA_B[12] = CXST_THETA5_B;
	
	F4_THETA_T0[0] = STCK_THETA4_T0;
	F4_THETA_T0[1] = STCK_THETA5_T0;

	F4_THETA_T0[2] = HYDR_THETA1_T0;
	F4_THETA_T0[3] = HYDR_THETA2_T0;
	F4_THETA_T0[4] = HYDR_THETA4_T0;
	F4_THETA_T0[5] = HYDR_THETA7_T0;
	
	F4_THETA_T0[6] = CRST_THETA1_T0;
	F4_THETA_T0[7] = CRST_THETA2_T0;
	F4_THETA_T0[8] = CRST_THETA4_T0;
	F4_THETA_T0[9] = CRST_THETA7_T0;

	F4_THETA_T0[10] = CXST_THETA1_T0;
	F4_THETA_T0[11] = CXST_THETA4_T0;
	F4_THETA_T0[12] = CXST_THETA5_T0;
	
	F4_THETA_TS[0] = STCK_THETA4_TS;
	F4_THETA_TS[1] = STCK_THETA5_TS;

	F4_THETA_TS[2] = HYDR_THETA1_TS;
	F4_THETA_TS[3] = HYDR_THETA2_TS;
	F4_THETA_TS[4] = HYDR_THETA4_TS;
	F4_THETA_TS[5] = HYDR_THETA7_TS;
	
	F4_THETA_TS[6] = CRST_THETA1_TS;
	F4_THETA_TS[7] = CRST_THETA2_TS;
	F4_THETA_TS[8] = CRST_THETA4_TS;
	F4_THETA_TS[9] = CRST_THETA7_TS;

	F4_THETA_TS[10] = CXST_THETA1_TS;
	F4_THETA_TS[11] = CXST_THETA4_TS;
	F4_THETA_TS[12] = CXST_THETA5_TS;
	
	F4_THETA_TC[0] = STCK_THETA4_TC;
	F4_THETA_TC[1] = STCK_THETA5_TC;
	
	F4_THETA_TC[2] = HYDR_THETA1_TC;
	F4_THETA_TC[3] = HYDR_THETA2_TC;
	F4_THETA_TC[4] = HYDR_THETA4_TC;
	F4_THETA_TC[5] = HYDR_THETA7_TC;
	
	F4_THETA_TC[6] = CRST_THETA1_TC;
	F4_THETA_TC[7] = CRST_THETA2_TC;
	F4_THETA_TC[8] = CRST_THETA4_TC;
	F4_THETA_TC[9] = CRST_THETA7_TC;

	F4_THETA_TC[10] = CXST_THETA1_TC;
	F4_THETA_TC[11] = CXST_THETA4_TC;
	F4_THETA_TC[12] = CXST_THETA5_TC;

	F5_PHI_A[0] = STCK_PHI1_A;
	F5_PHI_A[1] = STCK_PHI2_A;
	F5_PHI_A[2] = CXST_PHI3_A;
	F5_PHI_A[3] = CXST_PHI4_A;
	
	F5_PHI_B[0] = STCK_PHI1_B;
	F5_PHI_B[1] = STCK_PHI2_B;
	F5_PHI_B[2] = CXST_PHI3_B;
	F5_PHI_B[3] = CXST_PHI3_B;
	
	F5_PHI_XC[0] = STCK_PHI1_XC;
	F5_PHI_XC[1] = STCK_PHI2_XC;
	F5_PHI_XC[2] = CXST_PHI3_XC;
	F5_PHI_XC[3] = CXST_PHI4_XC;
	
	F5_PHI_XS[0] = STCK_PHI1_XS;
	F5_PHI_XS[1] = STCK_PHI2_XS;
	F5_PHI_XS[2] = CXST_PHI3_XS;
	F5_PHI_XS[3] = CXST_PHI4_XS;

	MESH_F4_POINTS[HYDR_F4_THETA1] = HYDR_T1_MESH_POINTS;
	MESH_F4_POINTS[HYDR_F4_THETA2] = HYDR_T2_MESH_POINTS;
	MESH_F4_POINTS[HYDR_F4_THETA4] = HYDR_T4_MESH_POINTS;
	MESH_F4_POINTS[HYDR_F4_THETA7] = HYDR_T7_MESH_POINTS;

	MESH_F4_POINTS[STCK_F4_THETA4] = STCK_T4_MESH_POINTS;
	MESH_F4_POINTS[STCK_F4_THETA5] = STCK_T5_MESH_POINTS;
	
	MESH_F4_POINTS[CRST_F4_THETA1] = CRST_T1_MESH_POINTS;
	MESH_F4_POINTS[CRST_F4_THETA2] = CRST_T2_MESH_POINTS;
	MESH_F4_POINTS[CRST_F4_THETA4] = CRST_T4_MESH_POINTS;
	MESH_F4_POINTS[CRST_F4_THETA7] = CRST_T7_MESH_POINTS;

	MESH_F4_POINTS[CXST_F4_THETA1] = CXST_T1_MESH_POINTS;
	MESH_F4_POINTS[CXST_F4_THETA4] = CXST_T4_MESH_POINTS;
	MESH_F4_POINTS[CXST_F4_THETA5] = CXST_T5_MESH_POINTS;

	for (int i = 0; i < 13; i++ ) {
		// the order of the interpolation interval extremes is reversed, due to
		// the cosine being monotonically decreasing with increasing x
		int points = MESH_F4_POINTS[i];
		number upplimit = cos(fmax( 0, F4_THETA_T0[i] - F4_THETA_TC[i]));
		number lowlimit = cos(fmin(PI, F4_THETA_T0[i] + F4_THETA_TC[i]));
		/*
		number lowlimit = fmax( 0, F4_THETA_T0[i] - F4_THETA_TC[i]);
		number upplimit = fmin(PI, F4_THETA_T0[i] + F4_THETA_TC[i]);
		*/

		if (i != CXST_F4_THETA1)
		  build_mesh(&Interaction<number>::fakef4, &Interaction<number>::fakef4D, (void *)(&i), points, lowlimit, upplimit, mesh_f4[i]);
		else
		  {
			build_mesh(&Interaction<number>::fakef4sp, &Interaction<number>::fakef4Dsp, (void *)(&i), points, lowlimit, upplimit, mesh_f4[i]);
		  }
		assert(lowlimit < upplimit);
	//	fprintf(stderr, "## %i %d %lf %lf\n", i, points, lowlimit, upplimit);
	  }
	
	/*
	//for (number x=-1; x < 1; x+=0.001) {
	for (number x=0; x <= PI; x += 0.001) {
	    int merda = CXST_F4_THETA1;
	    double i = ((int) ((cos(x) - mesh_f4[merda].xlow)/mesh_f4[merda].delta) ) * mesh_f4[merda].delta + mesh_f4[merda].xlow;
	    printf("%lf %lf %lf %lf %d\n", x, f4(x, merda) + f4(2 * PI - x, merda), query_mesh(cos(x), mesh_f4[merda]), query_mesh(i, mesh_f4[merda]), merda);
	    //printf("%lf %lf %lf %lf\n", x, f4(x, merda), f4(2 * PI - x, merda), f4(x, merda) + f4(2 * PI - x, merda));
	}


	for (int mn = 0; mn < 13; mn ++)
	  {
	    printf("###########################################\n");
	    printf("# MESH N %3d ##############################\n", mn);
	    printf("###########################################\n");
	    for (int k = 0; k < mesh_f4[mn].N && k < 20; k ++)
	      {
		printf ("%3d % 8.6lf % 8.6lf % 8.6lf % 8.6lf\n", k, mesh_f4[mn].A[k], mesh_f4[mn].B[k], mesh_f4[mn].A[k+1], mesh_f4[mn].B[k+1]);
	      }
	    printf("###########################################\n\n");
	  }
	abort();
	*/
}
Пример #6
0
	void system::set_geometry(const bool init) 
	{
		const double dt_max = 1.0/512;
		scheduler = Scheduler(dt_max);

		int np;
		float lx, ly, lz;
		FILE *fin = NULL;
		if (myproc == 0)
		{
			float wp;
			fin = fopen(fin_data, "r");
			int ival;
			size_t nread;

			nread = fread(&ival, sizeof(int), 1, fin);		assert(ival == 2*sizeof(int));
			nread = fread(&np, sizeof(int), 1, fin);
			nread = fread(&wp, sizeof(float), 1, fin);
			nread = fread(&ival, sizeof(int), 1, fin);		assert(ival == 2*sizeof(int));
			
			nread = fread(&ival, sizeof(int), 1, fin);		assert(ival == 3*sizeof(float));
			nread = fread(&lx, sizeof(float), 1, fin);
			nread = fread(&ly, sizeof(float), 1, fin);
			nread = fread(&lz, sizeof(float), 1, fin);
			nread = fread(&ival, sizeof(int), 1, fin);		assert(ival == 3*sizeof(float));

			fprintf(stderr, " np= %d  wp= %g \n",np, wp);
			fprintf(stderr, " lx= %g  ly= %g  lz= %g \n", lx, ly, lz);
		}

		MPI_Bcast(&lx,  1, MPI_FLOAT, 0, MPI_COMM_WORLD);
		MPI_Bcast(&ly,  1, MPI_FLOAT, 0, MPI_COMM_WORLD);
		MPI_Bcast(&lz,  1, MPI_FLOAT, 0, MPI_COMM_WORLD);

		t_end   = 0.2;

		n_restart = 2;
		dt_restart = dt_max;

		dt_dump = 0.01;

		di_log = 100;

		global_n = local_n = 0;

//		eulerian = true;

		const vec3 rmin(0.0);
		const vec3 rmax(lx, ly, lz);
		global_domain = boundary(rmin, rmax);
		global_domain_size = global_domain.hsize() * 2.0;

		const vec3 Len3 = global_domain.hsize() * 2.0;
		pfloat<0>::set_scale(Len3.x);
		pfloat<1>::set_scale(Len3.y);
		pfloat<2>::set_scale(Len3.z);

		if (myproc == 0) 
		{

			ptcl.resize(np);

			const int nx = (int)std::pow(np, 1.0/3.0);
			const dvec3 dr = dvec3(Len3.x/nx, Len3.y/nx, Len3.z/nx);
			const real rmax = dr.abs() * 1.0;

			fprintf(stderr, "dr= %g %g %g \n", dr.x, dr.y, dr.z);

			local_n  = ptcl.size();
			global_n = local_n;

			{
				std::vector<float> x(local_n), y(local_n), z(local_n);
				size_t nread;
				int ival;

				nread = fread(&ival, sizeof(int), 1, fin); assert(ival == local_n*(int)sizeof(float));
				nread = fread(&x[0], sizeof(float), local_n, fin);
				assert((int)nread == local_n);
				nread = fread(&ival, sizeof(int), 1, fin); assert(ival == local_n*(int)sizeof(float));
				
				nread = fread(&ival, sizeof(int), 1, fin); assert(ival == local_n*(int)sizeof(float));
				nread = fread(&y[0], sizeof(float), local_n, fin);
				assert((int)nread == local_n);
				nread = fread(&ival, sizeof(int), 1, fin); assert(ival == local_n*(int)sizeof(float));
				
				nread = fread(&ival, sizeof(int), 1, fin); assert(ival == local_n*(int)sizeof(float));
				nread = fread(&z[0], sizeof(float), local_n, fin);
				assert((int)nread == local_n);
				nread = fread(&ival, sizeof(int), 1, fin); assert(ival == local_n*(int)sizeof(float));

				for (int i = 0; i < local_n; i++)
				{
					const dvec3 vel(0.0, 0.0, 0.0);
					ptcl[i] = Particle(x[i], y[i], z[i], vel.x, vel.y, vel.z, i);
					ptcl[i].rmax = rmax;
					ptcl[i].unset_derefine();
				}
			}

			U.resize(local_n);
			const int var_list[7] = {
				Fluid::VELX,
				Fluid::VELY,
				Fluid::VELZ,
				Fluid::DENS,
				Fluid::BX,
				Fluid::BY,
				Fluid::BZ};

			std::vector<float> data(local_n);
			for (int var = 0; var < 7; var++)
			{
				fprintf(stderr, " reading vat %d out of %d \n", var+1, 7);
				int ival;
				size_t nread;
				nread = fread(&ival, sizeof(int), 1, fin); assert(ival == local_n*(int)sizeof(float));
				nread = fread(&data[0], sizeof(float), local_n, fin);
				assert((int)nread == local_n);
				nread = fread(&ival, sizeof(int), 1, fin); assert(ival == local_n*(int)sizeof(float));
				for (int i = 0; i < local_n; i++)
					U[i][var_list[var]] = data[i];
			}
			for (int i = 0; i < local_n; i++)
			{
				assert(U[i][Fluid::DENS] > 0.0);
				U[i][Fluid::ETHM] = cs2 * U[i][Fluid::DENS];
			}


			fclose(fin);

			fprintf(stderr, "  *** proc= %d : local_n= %d  global_n= %d \n", myproc, local_n, global_n);
		} // myproc == 0

		MPI_Bcast(&global_n,  1, MPI_INT, 0, MPI_COMM_WORLD);

		fprintf(stderr, " proc= %d  distrubite \n", myproc);
		MPI_Barrier(MPI_COMM_WORLD);

		Distribute::int3 nt(1, 1, 1);
		switch(nproc) {
			case 1: break;
			case 2: nt.x = 2; nt.y = 1; nt.z = 1; break;
			case 4: nt.x = 2; nt.y = 2; nt.z = 1; break;
			case 6: nt.x = 3; nt.y = 2; nt.z = 1; break;
			case 8: nt.x = 2; nt.y = 2; nt.z = 2; break;
			case 16: nt.x = 4; nt.y = 2; nt.z = 2; break;
			case 32: nt.x = 4; nt.y = 4; nt.z = 2; break;
			case 64: nt.x = 4; nt.y = 4; nt.z = 4; break;
			case 128: nt.x = 8; nt.y = 4; nt.z = 4; break;
			case 256: nt.x = 8; nt.y = 8; nt.z = 4; break;
			case 512: nt.x = 8; nt.y = 8; nt.z = 8; break;
			default: assert(false);
		}

		const Distribute::int3 nt_glb(nt);
		const pBoundary pglobal_domain(pfloat3(0.0), pfloat3(Len3));
		distribute_glb.set(nproc, nt, pglobal_domain);

		for (int k = 0; k < 5; k++)
			distribute_data(true, false);

		const int nloc_reserve = (int)(2.0*global_n/nproc);
		fit_reserve_vec(ptcl,      nloc_reserve);
		fit_reserve_vec(ptcl_ppos, nloc_reserve);
		fit_reserve_vec(U,         nloc_reserve);
		fit_reserve_vec(dU,        nloc_reserve);
		fit_reserve_vec(Wgrad,     nloc_reserve);
		fit_reserve_vec(gradPsi,   nloc_reserve);
		fit_reserve_vec(cells,     nloc_reserve);

		MPI_Barrier(MPI_COMM_WORLD);

		fprintf(stderr, " *** proc= %d : local_n= %d  global_n= %d \n", myproc, local_n, global_n);
		fprintf(stderr, " proc= %d  building_mesh \n", myproc);

		MPI_Barrier(MPI_COMM_WORLD);



		const double t10 = mytimer::get_wtime();
		clear_mesh();
		int nattempt = build_mesh(true);
		double dt10 = mytimer::get_wtime() - t10;

		double volume_loc = 0.0;
		{
			std::vector<TREAL> v(local_n);
			for (int i = 0; i < local_n; i++)
				v[i] = cells[i].Volume;
			std::sort(v.begin(), v.end());  // sort volumes from low to high, to avoid roundoff errors
			for (int i = 0; i < local_n; i++)
				volume_loc += v[i];
		}


		double dt10max;
		MPI_Allreduce(&dt10, &dt10max, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD);
		double volume_glob = 0.0;	
		int    nattempt_max, nattempt_min;
		MPI_Allreduce(&volume_loc, &volume_glob,  1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
		MPI_Allreduce(&nattempt,   &nattempt_max, 1, MPI_INT,    MPI_MAX, MPI_COMM_WORLD);
		MPI_Allreduce(&nattempt,   &nattempt_min, 1, MPI_INT,    MPI_MIN, MPI_COMM_WORLD);

		const double volume_exact = global_domain_size.x*global_domain_size.y*global_domain_size.z;
		if (myproc == 0)
		{
			fprintf(stderr, "first call build_mesh:[ %g  sec ::  %g cells/s/proc/thread ]\n",
					dt10max,
					global_n/nproc/dt10max);
			fprintf(stderr, "   computed_volume= %g  exact_volume= %g diff= %g [ %g ]  nattempt= %d %d \n",
					volume_glob, volume_exact, 
					volume_glob - volume_exact,	(volume_glob - volume_exact)/volume_exact,
					nattempt_min, nattempt_max);
		}

		exchange_ptcl();

	}