datei einlesen und daten verarbeiten



  • ok nehmen wir mal an das dein einlesen funktioniert...

    und nehmen wir mal an das du nur folgende 4 Atoma eingelesen hast

    ATOM 1 N GLN A 1 30.787 46.088 118.285 1.00 28.08 N
    ATOM 2 CA GLN A 1 32.175 45.617 118.561 1.00 23.62 C
    ATOM 3 C GLN A 1 32.741 46.312 119.795 1.00 20.98 C
    ATOM 4 O GLN A 1 32.499 47.502 119.997 1.00 18.84 O

    wie soll das was gerechnet werden...

    wenn ichs richtig verstanden habe ist bei ATOM 1 x=30.787 y=118.285 und z=118.285 ...
    analog für atom 2-4

    wie wird das ganze jetzt in die formel gepackt?
    berechne ich jetzt den abstand von atom1 zu atom2? und jage dann die Energieformel drüber?
    was ist dann mit dem abstand atom1 zu atom3 und atom1 zu atom4?....



  • schon richtig du hast mein problem erkannt
    nehmen wir an ich habe nur diese 4 atome dann versuche 😉 ich mittels meiner schleifen erst alle abstände (in dem fall 6) zu berechnen (mit der wurzelformel der koordinaten)
    und anschliessen versuch ich mit der schleife für alle gefundenen abstände die energien zu berechenen (also auch 6 energien)

    printf("EVDW:%lg\n",E);
    

    und abschliessend tu ich die gesammte energie berechnen (ein ergebniss)

    printf ("EtotVDW:%lg\n",EtotVDW);
    

    ➡ vielleicht habe ich auch richtig mist gebaut mit den schleifen und dadurch die rechnung ruiniert? hilfe

    for(i=1;i<= nb-1;i++) 
        { 
            for(j;j<=nb;j++) 
            {
    

    wobei ich das i als die in der zweiten spalte angegebene nummer nehme und das nb als die grösste mögliche nummer der spalte (wie auch immer die zu finden sei, soweit bin ich noch nicht vorgedrungen 😕 )



  • spontan würd ich sagen das deine schleifen dann so laufen müssen...

    int i,j;
    for(i=0;i<anzahl-1;++i){
      for(j=i+1;j<anzahl;++j){
    
        //hier dann die formeln reinballern...
      }
    }
    


  • sags ja nur ungerne aber das hilft gar nix
    im gegenteil da hab ich dann auch noch ausführprobleme des programms
    kann aber gerne nochmal den gesammtcode zur verfügung stellen obwohl er an oberster stelle schon steht



  • öhm was hilft den daran gar nicht

    int i,j,x_2,y_2,z_2,r_2;
    double total_energie=0;;
    for(i=0;i<anzahl-1;++i){
      for(j=i+1;j<anzahl;++j){
        x_2=pow(coordinateslist[i].x - coordinateslist[j].x,2); 
        y_2=pow(coordinateslist[i].y - coordinateslist[j].y,2); 
        z_2=pow(coordinateslist[i].z - coordinateslist[j].z,2); 
    
        r_2=x_2+y_2+z_2;
    
      total_energie+=3/pow(r_2,3) - 7/pow(r_2,6);
      }
    }
    

    oder was genau ist denn bei der rechnung nun dein problem?...



  • geht auch nicht
    mein problem:
    ausgeführt sieht das so aus:
    r fuer A: 0.000000,r fuer B: 0.000000
    EVDW:-1.#IND
    EtotVDW:-1.#IND
    X:0
    Y:0
    Z:0
    r:0
    r fuer A: 0.000000,r fuer B: 0.000000
    EVDW:-1.#IND
    EtotVDW:-1.#IND
    X:0
    Y:0
    Z:0
    r:0

    das gibt er mir für mein bsp mit 25 atomen 42mal
    wo ich aber bei 25 atomen 200 abstände bekommen müsste
    dann fragt er mich nach dem r-cutoff für das 2-te atom?

    nochmal
    das ziel ist es die x, y, z koordinaten in der gegebenen datei zu lesen
    und anschliessen mit ihnen die abstände (r) zu berechenen (bei 25 sind das 200)
    dann 200 mal die energie berechnen
    und schliesslich die gesamte energie
    vielleicht sind aber auch so viele denkfehler in dem programm das ich von vorne anfangen kann
    keine ahnung 😕 so ein mist



  • also bei mir geht das
    habs mal eben schnell umgeschrieben...
    da ich vermute das du c und nicht c++ nimmst hab ichs in c gelassen

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
    
    typedef struct {char key[6];char name[4];double x;double y;double z;}coordinates; 
    
    int catFcoordChar(char *fcoordinates){
    
            int anzcoords=0; 
            int i,j;
    		double x_2,y_2,z_2,r_2,energie,total_energie=0;
    		char buffer [512]; 
            char dummy[512];
    		FILE *inF;                                                                                                                             
            coordinates *coordinateslist; 
    
    		coordinateslist=(coordinates*)malloc(sizeof(coordinates));
    		if(!(inF=fopen(fcoordinates, "r")))return -1; 
    
            while (fgets(buffer,sizeof(buffer),inF)){
    			if (strstr(buffer,"ATOM")){ 
    
    				coordinateslist=(coordinates*) realloc(coordinateslist,(anzcoords+1)*sizeof(coordinates)); 
    				sscanf(buffer,"%s%s%s%s%s%s%lf%lf%lf",coordinateslist[anzcoords].key,coordinateslist[anzcoords].name,dummy,dummy,dummy,dummy,&coordinateslist[anzcoords].x,&coordinateslist[anzcoords].y,&coordinateslist[anzcoords].z);
    
                    printf("%s %s %lf %lf %lf \n", 
                            coordinateslist[anzcoords].key, 
                            coordinateslist[anzcoords].name, 
                            coordinateslist[anzcoords].x, 
                            coordinateslist[anzcoords].y, 
                            coordinateslist[anzcoords].z);         
    			    ++anzcoords;
    			} 
    
    		}
    
    	if(anzcoords){
    		for(i=0;i<anzcoords-1;++i){ 
    			for(j=i+1;j<anzcoords;++j){ 
    				x_2=pow(coordinateslist[i].x - coordinateslist[j].x,2); 
    				y_2=pow(coordinateslist[i].y - coordinateslist[j].y,2); 
    				z_2=pow(coordinateslist[i].z - coordinateslist[j].z,2); 
    				r_2=x_2+y_2+z_2; 
    				energie= 3/pow(r_2,3) - 7/pow(r_2,6);       
    				total_energie+= energie;
    				printf("r_2: %f\tEnergie: %f\n",r_2,energie);
    			  } 
    		} 
    
    		printf("ATOME: %d\n",anzcoords);
    		printf("Gesamtenergie: %f\n",total_energie);
    	}
    
    	return 0;         
    } 
    
    int main(){
    if(catFcoordChar("test.txt")) 
      fprintf(stderr,"coordinates.pdb gibts nicht\n\n"); 
    return 0; 
    }
    


  • es läuft 🙂 (obwohl ich im übrigen tatsächlich einen c++ compiler verwende)
    vielen dank



  • obwohl ich das ergebniss
    Gesamtenergie: -1.#IND00
    doch ein bisschen seltsam finde und auch noch mit der anzahl der berechneten energien unstimmig bin (bei 25 atomen müssten es 200 einzelenergien sein und nicht 75)
    naja...



  • also mit den einzelenergien seh ich das so

    Atome Energien
    1 0
    2 1
    3 3
    4 6
    5 10
    6 15

    usw...

    also summe n-1 was ja bekannt n*(n-1)/2 ist...

    bei 25 atomen würde ich also mit 25*24/2=300 Energien rechnen oder wie soll das genau mit den energien laufen... Ich vermute mal ich hab da dann was anderes modelliert als du haben wolltest...



  • formel volkommen richtig
    ich habe aber 75 statt 300 energie werte, ein komisches ergebniss für die gesamt energie und du hast meine bedingung mit r-cutoff und meine start bedingung in der datei (bei ATOM) unterschlagen (vermute ich zumindest, da er mir bei 25 vorhandene atomen 34 findet, er rechnet alles vorher auch mit rein)?
    und hin&und wieder spinnt der compiler und stürzt ab (c++?) 😕



  • jaja die chemiker 😉
    ka was du da wieder genau fabrizierst...
    kannst mir deine uminöse textdatei ja mal mailen..., dann ja ich die mal bei mir durch mal gucken was der da rausbekommt...



  • eher ungünstig,da platzt das forum
    hat über 6000 seiten...



  • öhm ich sprach von mailen nicht posten... 😉



  • 😕



  • was soll mir dieser smilie jetzt sagen?



  • übersetzte:
    wie zur hölle verdammt maile ich hier in dem forum was



  • müsste doch unter meinem profil anzuklicken sein oder?


Anmelden zum Antworten