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, ""); }
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; }
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, ""); }
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, ""); }
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); } } }
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()); } } }
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)); } }
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)); } } }
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)); } } }
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, ""); }
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, ""); }