void AlmacenaToComsol_1::aplicar(Malla *malla, string filename){
	//Lineas necesarias para que scanf lea archivo en computadores seteados en otro lenguaje.
	setlocale(LC_NUMERIC, "POSIX");

	FILE *archivo_x = fopen(filename.c_str(),"w");

	char separador1[32] = "% Coordinates\n";
    fprintf(archivo_x,"%s",separador1);

    Nodo *nodo;
	int* nuevoIndiceNodos=new int[malla->getMaxIndiceNodos()+1];
	int nlinea=0;
    for(int i=0; i<=malla->getMaxIndiceNodos(); i++) {
        nodo = malla->getNodo(i);
        if(nodo != NULL) {
            fprintf(archivo_x,"%f   %f  %f\n",nodo->getPunto().getX(),nodo->getPunto().getY(),nodo->getPunto().getZ());
        	nuevoIndiceNodos[i]=nlinea;
			nlinea++;
		}
    }

    ostringstream myStream;
    myStream << "% Elements (" << malla->getTipoMalla() << ")\n";
    string str_separador2 = myStream.str();
    const char *separador2 = str_separador2.c_str();

    fprintf(archivo_x,"%s",separador2);

    Cara *c;
    vector<int> ind_nodos;
    for(int i=0; i<=malla->getMaxIndiceCaras(); i++) {
        c = malla->getCara(i);
        if(c != 0) {
            ind_nodos = c->getNodos();
			//Nota: Se invierte el orden de insercion de los puntos, para que las normales queden seteadas correctamente.
			//ya que en el archivo cms_1 los nodos estan al reves, dejando las normales hacia adentro.
            //for(int j=c->getNumElem()-1; j>=0 ;--j) { // Por bug archivos de entrada
            for(int j=0; j<c->getNumElem(); ++j) { // así debiera ser
                char *delimitador = "  ";
                //if(j == 0) // Por bug archivos de entrada
                if(j == c->getNumElem()-1) // así debiera ser
                    delimitador = "\n";
                fprintf(archivo_x,"%d%s",nuevoIndiceNodos[ind_nodos[j]]+1,delimitador);
            }
        }
    }

	delete nuevoIndiceNodos;

    fclose(archivo_x);

	setlocale(LC_NUMERIC, "");
	}
示例#2
0
文件: nodos.cpp 项目: gurroz/Memori
Nodos::Nodos(vector<Nodo*> nds) {
    num_nodos = nds.size();
    num_nodos_validos = nds.size();
    nodos = nds;
    double mx = -1*numeric_limits<float>::max();
    double mix = numeric_limits<float>::max();
    double my = -1*numeric_limits<float>::max();
    double miy = numeric_limits<float>::max();
    double mz = -1*numeric_limits<float>::max();
    double miz = numeric_limits<float>::max();
    for(int i = 0; i < (int)nds.size(); ++i){
        Nodo* n = nds[i];
		if( n!= 0){
		    Punto p = n->getPunto();
		    double x = p.getX();
		    double y = p.getY();
		    double z = p.getZ();
		    if(x>mx) mx = x;
		    if(x<mix) mix = x;
		    if(y>my) my = y;
		    if(y<miy) miy = y;
		    if(z>mz) mz = z;
		    if(z<miz) miz = z;
		}
    }
    this->maxx = mx;
    this->minx = mix;
    this->maxy = my;
    this->miny = miy;
    this->maxz = mz;
    this->minz = miz;

    nodos_marcados = NULL;
}
示例#3
0
void AlmacenaToOff::aplicar(Malla *malla, string filename){
	//Lineas necesarias para que scanf lea archivo en computadores seteados en otro lenguaje.
	setlocale(LC_NUMERIC, "POSIX");

	FILE *archivoSalida = fopen(filename.c_str(),"w");
	fprintf(archivoSalida,"OFF\n");

    fprintf(archivoSalida,"%d %d %d\n",malla->getNumNodos(),malla->getNumCaras(),malla->getNumArcos());

    Nodo *nodo;
	int* nuevoIndiceNodos=new int[malla->getMaxIndiceNodos()+1];
	int nlinea=0;
    for(int i=0; i<=malla->getMaxIndiceNodos(); i++) {
        nodo = malla->getNodo(i);
        if(nodo != NULL) {
            fprintf(archivoSalida,"%f %f %f\n",nodo->getPunto().getX(),nodo->getPunto().getY(),nodo->getPunto().getZ());
        	nuevoIndiceNodos[i]=nlinea;
			nlinea++;
		}
    }

    Cara *c;
    vector<int> ind_nodos;
    vector<int> ind_arcos;
    for(int i=0; i<=malla->getMaxIndiceCaras(); i++) {
        c = malla->getCara(i);
        if(c != 0) {
            ind_nodos = c->getNodos();
            ind_arcos = c->getArcos();
            fprintf(archivoSalida,"%d ",c->getNumElem());
            double conc_prom = 0;
            for(int j=0; j<(int)ind_nodos.size(); j++) {
                conc_prom = conc_prom + malla->getNodo(ind_nodos[j])->getConcentracion();
                fprintf(archivoSalida,"%d ",nuevoIndiceNodos[ind_nodos[j]]);
            }
            fprintf(archivoSalida,"\n");
        }
    }

	delete nuevoIndiceNodos;

    fclose(archivoSalida);

	setlocale(LC_NUMERIC, "");
	}
示例#4
0
文件: nodos.cpp 项目: gurroz/Memori
void Nodos::moverNodo(int indice, double x, double y, double z, double dist) {
    if(indice == -1) {
        return;
    }
    if(indice >= (int)nodos.size() || indice < 0) {
        cout << "Error: Moviendo Nodo(" << indice << "). Numero de nodos = " << nodos.size() << endl;
        assert((indice < (int)nodos.size()) && (indice >= 0));
    }
    Nodo *n = nodos[indice];
    //movemos el nodo una distancia dist.
    double x1,y1,z1;
    if(n != 0) {
        x1=n->getPunto().getX()+x*dist;
        y1=n->getPunto().getY()+y*dist;
        z1=n->getPunto().getZ()+z*dist;
        n->setPunto(Punto(x1,y1,z1));
    }
};
void AlmacenaToComsol_1::aplicar(Malla *malla, string filename){
	//Lineas necesarias para que scanf lea archivo en computadores seteados en otro lenguaje.
	setlocale(LC_NUMERIC, "POSIX");
	
	FILE *archivo_x = fopen(filename.c_str(),"w");
	
	char separador1[32] = "% Coordinates\n";
    fprintf(archivo_x,"%s",separador1);
    
    Nodos *nds = malla->getNodos();
    Caras *crs = malla->getCaras();
    
    Nodo *nodo;
	int* nuevoIndiceNodos=new int[nds->getNumNodos()];
	int nlinea=0;
    for(int i=0; i<nds->getNumNodos(); i++) {
        nodo = nds->getNodo(i);
        if(nodo != NULL) {
            fprintf(archivo_x,"%f   %f  %f\n",nodo->getPunto()->getX(),nodo->getPunto()->getY(),nodo->getPunto()->getZ());
        	nuevoIndiceNodos[i]=nlinea;
			nlinea++;
		}
    }
    char separador2[32] = "% Elements (triangular)\n";
    fprintf(archivo_x,"%s",separador2);
    
    Cara *c;
    vector<int> ind_nodos;
    for(int i=0; i<crs->getNumCaras(); i++) {
        c = crs->getCara(i);
        if(c != 0) {
            ind_nodos = c->getNodos();
			//Nota: Se invierte el orden de insercion de los puntos, para que las normales queden seteadas correctamente.
			//ya que en el archivo cms_1 los nodos estan al reves, dejando las normales hacia adentro.
            fprintf(archivo_x,"%d   %d  %d\n",nuevoIndiceNodos[ind_nodos[2]]+1,nuevoIndiceNodos[ind_nodos[1]]+1,nuevoIndiceNodos[ind_nodos[0]]+1);
        }
    }
    
	delete nuevoIndiceNodos;
    
    fclose(archivo_x);
	
	setlocale(LC_NUMERIC, "");
	}
示例#6
0
void Nodos::regresarNodo(int indice, double dist) {
    if(indice == -1) {
        return;
    }
    if(indice >= (int)nodos.size() || indice < 0) {
        cout << "Error: Regresando Nodo(" << indice << "). Numero de nodos = " << nodos.size() << endl;
        assert((indice < (int)nodos.size()) && (indice >= 0));
    }
    Nodo *n = nodos[indice];
    //regresamos el nodo una distancia dist.
    if(n != 0) {
        Vect *normal = n->getNormal();
        if(normal != 0) {
            n->getPunto()->setX(n->getPunto()->getX()-normal->getPunto().getX()*dist);
            n->getPunto()->setY(n->getPunto()->getY()-normal->getPunto().getY()*dist);
            n->getPunto()->setZ(n->getPunto()->getZ()-normal->getPunto().getZ()*dist);
        }
    }
}
示例#7
0
void Nodos::moverNodoSegunConcentracion(int indice, double val) {
    if(indice == -1) {
        return;
    }
    if(indice >= (int)nodos.size() || indice < 0) {
        cout << "Error: Moviendo Nodo(" << indice << "). Numero de nodos = " << nodos.size() << endl;
        assert((indice < (int)nodos.size()) && (indice >= 0));
    }
    Nodo *n = nodos[indice];
    //movemos el nodo una distancia dist.
    if(n != 0) {
        Vect *normal = n->getNormal();
        if(normal != 0) {
            n->getPunto()->setX(n->getPunto()->getX()+normal->getPunto().getX()*val*n->getConcentracion());
            n->getPunto()->setY(n->getPunto()->getY()+normal->getPunto().getY()*val*n->getConcentracion());
            n->getPunto()->setZ(n->getPunto()->getZ()+normal->getPunto().getZ()*val*n->getConcentracion());
        }
    }
}
示例#8
0
void MovimientosAUV::moverNodosSegunParametro(int indice, double valor, Malla *malla){

    int nNodos = malla->getMaxIndiceNodos();
    double xs[nNodos +1];
    double ys[nNodos +1];
    double zs[nNodos +1];

    for(int i = 0; i <= nNodos; ++i){
        xs[i] = 0.0;
        ys[i] = 0.0;
        zs[i] = 0.0;
    }

    for(int i = 0; i < malla->getNodos()->n_marcados; ++i){
        Punto *p = this->getMovimiento(i, indice);
        int ind = malla->getNodos()->nodos_marcados[i];
        xs[ind] = p->getX();
        ys[ind] = p->getY();
        zs[ind] = p->getZ();
    }

    for(int i = 0; i <= nNodos; ++i){
        Nodo *n = malla->getNodo(i);
        int i1 = n->getAsociado1();
        int i2 = n->getAsociado2();
        int i3 = n->getAsociado3();

        if(i1<0 || i2<0 || i3<0)
            continue;

        float coef1 = n->getCoef1();
        float coef2 = n->getCoef2();
        float coef3 = n->getCoef3();

        float newX = n->getPunto().getX() + coef1*xs[i1]*valor + coef2*xs[i2]*valor + coef3*xs[i3]*valor;
        float newY = n->getPunto().getY() + coef1*ys[i1]*valor + coef2*ys[i2]*valor + coef3*ys[i3]*valor;
        float newZ = n->getPunto().getZ() + coef1*zs[i1]*valor + coef2*zs[i2]*valor + coef3*zs[i3]*valor;

        n->setPunto(Punto(newX, newY, newZ));
    }

}
示例#9
0
文件: nodos.cpp 项目: gurroz/Memori
void Nodos::regresarNodoSegunConcentracion(int indice, double val) {
    if(indice == -1) {
        return;
    }
    if(indice >= (int)nodos.size() || indice < 0) {
        cout << "Error: Regresando Nodo(" << indice << "). Numero de nodos = " << nodos.size() << endl;
        assert((indice < (int)nodos.size()) && (indice >= 0));
    }
    Nodo *n = nodos[indice];
    //regresamos el nodo una distancia dist.
    double x,y,z;
    if(n != 0) {
        Vect normal = n->getNormal();
        if(normal.largo() > 0) {
            x=n->getPunto().getX()-normal.getPunto().getX()*val*n->getConcentracion();
            y=n->getPunto().getY()-normal.getPunto().getY()*val*n->getConcentracion();
            z=n->getPunto().getZ()-normal.getPunto().getZ()*val*n->getConcentracion();
            n->setPunto(Punto(x,y,z));
        }
    }
}
示例#10
0
文件: nodos.cpp 项目: gurroz/Memori
void Nodos::moverNodo(int indice, double dist) {
    if(indice == -1) {
        return;
    }
    if(indice >= (int)nodos.size() || indice < 0) {
        cout << "Error: Moviendo Nodo(" << indice << "). Numero de nodos = " << nodos.size() << endl;
        assert((indice < (int)nodos.size()) && (indice >= 0));
    }
    Nodo *n = nodos[indice];
    //movemos el nodo una distancia dist.
    double x,y,z;
    if(n != 0) {
        Vect normal = n->getNormal();
        if(normal.largo() > 0) {
            x=n->getPunto().getX()+normal.getPunto().getX()*dist;
            y=n->getPunto().getY()+normal.getPunto().getY()*dist;
            z=n->getPunto().getZ()+normal.getPunto().getZ()*dist;
            n->setPunto(Punto(x,y,z));
        }
    }
}
示例#11
0
void AlmacenaToMllDebug::aplicar(Malla *malla, string filename){
	//Lineas necesarias para que scanf lea archivo en computadores seteados en otro lenguaje.
	setlocale(LC_NUMERIC, "POSIX");

	FILE *archivoSalida = fopen(filename.c_str(),"w");

	fprintf(archivoSalida,"MLL (Debug file)\n");

    fprintf(archivoSalida,"%d %d %d\n",malla->getMaxIndiceNodos()+1,malla->getMaxIndiceCaras()+1,malla->getMaxIndiceArcos()+1);
    fprintf(archivoSalida,"%d %d %d\n",malla->getNumNodos(),malla->getNumCaras(),malla->getNumArcos());

    Nodo *nodo;
    Vect normal;
    cout << "Recorriendo Nodos" << endl;
    for(int i=0; i<=malla->getMaxIndiceNodos(); i++) {
        nodo = malla->getNodo(i);
        if(nodo == 0) {
            fprintf(archivoSalida,"Nodo{%d}=Vacio \n",i);
        }
        else {
            fprintf(archivoSalida,"Nodo{%d}=(%f,%f,%f) ",i,nodo->getPunto().getX(),nodo->getPunto().getY(),nodo->getPunto().getZ());

            vector<int> caras = nodo->getCaras();
            vector<int> arcos = nodo->getArcos();
            fprintf(archivoSalida,"Caras{");
            for(int j=0; j<(int)caras.size(); j++) {
                fprintf(archivoSalida,"%d",caras[j]);
                if(j<(int)caras.size()-1) {
                    fprintf(archivoSalida,",");
                }
            }
            fprintf(archivoSalida,"} Arcos{");
            for(int j=0; j<(int)arcos.size(); j++) {
                fprintf(archivoSalida,"%d",arcos[j]);
                if(j<(int)arcos.size()-1) {
                    fprintf(archivoSalida,",");
                }
            }
            fprintf(archivoSalida,"} ");
            normal = malla->getNodo(i)->getNormal();
            fprintf(archivoSalida,"Normal=(%f,%f,%f) ",normal.getPunto().getX(),normal.getPunto().getY(),normal.getPunto().getZ());
            fprintf(archivoSalida,"Concentracion={%f}",nodo->getConcentracion());
            fprintf(archivoSalida,"\n");
        }
    }
    cout << "Pasamos nodos" << endl;
    Arco *a;
    for(int i=0; i<=malla->getMaxIndiceArcos(); i++) {
        a = malla->getArco(i);
        //si se elimino un arco, puede que en esa posicion exista un puntero igual a 0, por eso nos aseguramos que el arco sea distinto de 0.
        if(a == 0) {
            fprintf(archivoSalida,"Arco{%d} Vacio\n",i);
        }
        else {
            fprintf(archivoSalida,"Arco{%d} Nodos{%d,%d} Caras{%d,%d}\n",i,a->getNodo1(),a->getNodo2(),a->getCara1(),a->getCara2());
        }
    }

    Cara *c;
    vector<int> ind_nodos;
    vector<int> ind_arcos;
    for(int i=0; i<=malla->getMaxIndiceCaras(); i++) {
        c = malla->getCara(i);
        //si se elimino una cara, puede que en esa posicion exista un puntero igual a 0, por eso nos aseguramos que la cara sea distinta de 0.
        if(c == 0) {
            fprintf(archivoSalida,"Cara{%d} Vacia\n",i);
        }
        else {
            ind_nodos = c->getNodos();
            ind_arcos = c->getArcos();
            fprintf(archivoSalida,"Cara{%d} %d ",i,c->getNumElem());
            fprintf(archivoSalida,"Nodos{");
            double conc_prom = 0;
            for(int j=0; j<(int)ind_nodos.size(); j++) {
                conc_prom = conc_prom + malla->getNodo(ind_nodos[j])->getConcentracion();
                fprintf(archivoSalida,"%d",ind_nodos[j]);
                if(j<(int)ind_nodos.size()-1) {
                    fprintf(archivoSalida,",");
                }
            }
            fprintf(archivoSalida,"} ");
            fprintf(archivoSalida,"Arcos{");
            for(int j=0; j<(int)ind_arcos.size(); j++) {
                if(malla->getArco(ind_arcos[j]) != 0) {
                    fprintf(archivoSalida,"%d:%d-->%d",ind_arcos[j],malla->getArco(ind_arcos[j])->getNodo1(),malla->getArco(ind_arcos[j])->getNodo2());
                    if(j<(int)ind_arcos.size()-1) {
                        fprintf(archivoSalida,",");
                    }
                }
            }
            fprintf(archivoSalida,"} ");
            Vect normal = c->getNormal(malla);
            fprintf(archivoSalida,"Normal=(%f,%f,%f) ",normal.getPunto().getX(),normal.getPunto().getY(),normal.getPunto().getZ());
            fprintf(archivoSalida,"Concentracion=%f",conc_prom);
            fprintf(archivoSalida,"\n");
        }
    }

    fclose(archivoSalida);

	setlocale(LC_NUMERIC, "");
	}
示例#12
0
void AlmacenaToXYZU::aplicar(Malla *malla, string filename){
	//Lineas necesarias para que scanf lea archivo en computadores seteados en otro lenguaje.
	setlocale(LC_NUMERIC, "POSIX");

	int posextension=filename.rfind(".");
	string nombrefile=filename.substr(0,posextension);
	string extension=filename.substr(posextension+1,filename.length());

	if (posextension==0){
		nombrefile=filename;
		extension="txt";
		}


	stringstream archivox;
	stringstream archivoy;
	stringstream archivoz;
	stringstream archivou;

	archivox << nombrefile << "_nx." << extension;
	archivoy << nombrefile << "_ny." << extension;
	archivoz << nombrefile << "_nz." << extension;
	archivou << nombrefile << "_u." << extension;

	FILE *archivo_x = fopen(archivox.str().c_str(),"w");
	FILE *archivo_y = fopen(archivoy.str().c_str(),"w");
	FILE *archivo_z = fopen(archivoz.str().c_str(),"w");
	FILE *archivo_u = fopen(archivou.str().c_str(),"w");

	char separador1[32] = "% Coordinates\n";
    fprintf(archivo_x,"%s",separador1);
    fprintf(archivo_y,"%s",separador1);
    fprintf(archivo_z,"%s",separador1);
    fprintf(archivo_u,"%s",separador1);

    Nodos *nds = malla->getNodos();
    Caras *crs = malla->getCaras();

    Nodo *nodo;
	int* nuevoIndiceNodos=new int[nds->getNumNodos()];
	int nlinea=0;
    for(int i=0; i<nds->getNumNodos(); i++) {
        nodo = nds->getNodo(i);
        if(nodo != NULL) {
            fprintf(archivo_x,"%f   %f  %f\n",nodo->getPunto()->getX(),nodo->getPunto()->getY(),nodo->getPunto()->getZ());
            fprintf(archivo_y,"%f   %f  %f\n",nodo->getPunto()->getX(),nodo->getPunto()->getY(),nodo->getPunto()->getZ());
            fprintf(archivo_z,"%f   %f  %f\n",nodo->getPunto()->getX(),nodo->getPunto()->getY(),nodo->getPunto()->getZ());
            fprintf(archivo_u,"%f   %f  %f\n",nodo->getPunto()->getX(),nodo->getPunto()->getY(),nodo->getPunto()->getZ());
        	nuevoIndiceNodos[i]=nlinea;
			nlinea++;
		}
    }
    char separador2[32] = "% Elements (triangular)\n";
    fprintf(archivo_x,"%s",separador2);
    fprintf(archivo_y,"%s",separador2);
    fprintf(archivo_z,"%s",separador2);
    fprintf(archivo_u,"%s",separador2);

    Cara *c;
    vector<int> ind_nodos;
    for(int i=0; i<crs->getNumCaras(); i++) {
        c = crs->getCara(i);
        if(c != 0) {
            ind_nodos = c->getNodos();
            fprintf(archivo_x,"%d   %d  %d\n",nuevoIndiceNodos[ind_nodos[0]]+1,nuevoIndiceNodos[ind_nodos[1]]+1,nuevoIndiceNodos[ind_nodos[2]]+1);
            fprintf(archivo_y,"%d   %d  %d\n",nuevoIndiceNodos[ind_nodos[0]]+1,nuevoIndiceNodos[ind_nodos[1]]+1,nuevoIndiceNodos[ind_nodos[2]]+1);
			fprintf(archivo_z,"%d   %d  %d\n",nuevoIndiceNodos[ind_nodos[0]]+1,nuevoIndiceNodos[ind_nodos[1]]+1,nuevoIndiceNodos[ind_nodos[2]]+1);
			fprintf(archivo_u,"%d   %d  %d\n",nuevoIndiceNodos[ind_nodos[0]]+1,nuevoIndiceNodos[ind_nodos[1]]+1,nuevoIndiceNodos[ind_nodos[2]]+1);

        }
    }

    char separador_x[32] = "% Data (nx)\n";
    char separador_y[32] = "% Data (ny)\n";
    char separador_z[32] = "% Data (nz)\n";
    char separador_u[32] = "% Data (u)\n";

    fprintf(archivo_x,"%s",separador_x);
    fprintf(archivo_y,"%s",separador_y);
    fprintf(archivo_z,"%s",separador_z);
    fprintf(archivo_u,"%s",separador_u);

    for(int i=0; i<nds->getNumNodos(); i++) {
        nodo = nds->getNodo(i);
//         cout << nodo->imprimir() << endl;
        if(nodo != NULL) {
            fprintf(archivo_x,"%f\n",nodo->getNormal()->getPunto().getX());
            fprintf(archivo_y,"%f\n",nodo->getNormal()->getPunto().getY());
            fprintf(archivo_z,"%f\n",nodo->getNormal()->getPunto().getZ());
            fprintf(archivo_u,"%f\n",nodo->getConcentracion());
        }
    }

	delete nuevoIndiceNodos;

    fclose(archivo_x);
    fclose(archivo_y);
    fclose(archivo_z);
    fclose(archivo_u);

	setlocale(LC_NUMERIC, "");
	}