/*============================================================================ * Modification des coordonnées d'un fichier de maillage * IDEAS-MS au format "universel" *============================================================================*/ /* Code_Saturne version 1.3 ------------------------ This file is part of the Code_Saturne Preprocessor, element of the Code_Saturne CFD tool. Copyright (C) 1999-2007 EDF S.A., France contact: saturne-support@edf.fr The Code_Saturne Preprocessor is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The Code_Saturne Preprocessor is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the Code_Saturne Preprocessor; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include #include /* Pour une lecture de 80 caracteres par ligne */ /* auxquels il faut ajouter le `\n' et le `\0' */ /* pour l'affectation dans la chaine receptrice */ #define LNG_MAX_CHAINE_IDEAS 82 /* Dimension des chaînes */ typedef enum { HORS_DATASET, MARQUE_DEB, NUM_DATASET, CONTENU, MARQUE_FIN } ligne_data_t; /*---------------------------------------------------------------------------- * Fonction utilitaire pour la lecture/écriture des réels d'un fichier * I-DEAS. * * La chaîne contenant un réel avec (ou non) un exposant `d' ou `D' * est convertie en réel avec un exposant `e' *----------------------------------------------------------------------------*/ static void transf_geo ( double *x, double *y, double *z ) { *x = (*x) * 1.0; *y = (*y) * 1.0; *z = (*z) * 1.0; } /*============================================================================ * Fonction principale *============================================================================*/ int main ( int argc , char * argv[] ) { char chaine[LNG_MAX_CHAINE_IDEAS + 2]; char *s; FILE *fic_lec, *fic_ecr; int ret; char *res = NULL; ligne_data_t ind_rub = HORS_DATASET; int ds_nod = 0; int ind_pair = 0; /*xxxxxxxxxxxxxxxxxxxxxxxxxxx Instructions xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/ if (argc < 3) { printf("Utilisation :\n%s nom_fic nom_fic_conv\n", argv[0]); exit(EXIT_FAILURE); } fic_lec = fopen(argv[1], "rb"); if (fic_lec == NULL) { fprintf(stderr, "Erreur à l'ouverture en lecture du fichier %s\n", argv[1]); return EXIT_FAILURE; } fic_ecr = fopen(argv[2], "wb"); if (fic_ecr == NULL) { fprintf(stderr, "Erreur à l'ouverture en écriture du fichier %s\n", argv[2]); return EXIT_FAILURE; } while (ds_nod == 0 && feof(fic_lec) == 0) { res = fgets(chaine, LNG_MAX_CHAINE_IDEAS, fic_lec) ; if (res != NULL) { /* Début ou fin de rubrique */ if ((ind_rub == HORS_DATASET || ind_rub == CONTENU) && strlen(chaine) < 8) { if (strncmp(chaine, " -1", 6) == 0) { if (ind_rub == HORS_DATASET) ind_rub = MARQUE_DEB; else ind_rub = MARQUE_FIN; } } /* Numéro de rubrique */ else if (ind_rub == NUM_DATASET) { if (strncmp(chaine, " 2411", 6) == 0) { fprintf(fic_ecr, "%s", chaine); break; } } fprintf(fic_ecr, "%s", chaine); /* Préparation ligne suivante */ switch(ind_rub) { case MARQUE_DEB: ind_rub = NUM_DATASET; break; case NUM_DATASET: ind_rub = CONTENU; break; case MARQUE_FIN: ind_rub = HORS_DATASET; break; default: break; } } } while (feof(fic_lec) == 0) { res = fgets(chaine, LNG_MAX_CHAINE_IDEAS, fic_lec) ; if (res != NULL) { if (strlen(chaine) < 8 && strncmp(chaine, " -1", 6) == 0) { fprintf(fic_ecr, "%s", chaine); break; } /* Ligne paire ou impaire ? */ if (ind_pair == 0) ind_pair = 1; else { char ch_coord[3][LNG_MAX_CHAINE_IDEAS]; double coord[3]; ind_pair = 0; s = chaine ; while(*s != '\0' ) { if (*s == 'D' || *s == 'd') *s = 'e' ; s++ ; } ret = sscanf(chaine, " %lf %lf %lf", coord, coord+1, coord+2); transf_geo(coord, coord+1, coord+2); sprintf(chaine, " %24.16E %24.16E %24.16E\n", coord[0], coord[1], coord[2]); s = chaine ; while(*s != '\0' ) { if (*s == 'E' || *s == 'e') *s = 'D' ; s++ ; } } fprintf(fic_ecr, "%s", chaine); } } /* Recopie simple de la suite du fichier */ while (feof(fic_lec) == 0) { res = fgets(chaine, LNG_MAX_CHAINE_IDEAS, fic_lec) ; if (res != NULL) fprintf(fic_ecr, "%s", chaine); } /* Fin */ fclose(fic_lec); fclose(fic_ecr); return EXIT_SUCCESS ; }