Problema con l'output di dati

di Anonimizzato26104 il
17 risposte
Salve, essendo il mio primo post mi presento, sono un laureando in Ingegneria civile quindi non mi intendo molto del linguaggio c++ e mi sono avvicinato a questo mondo per la mia tesi. Ho scaricato il codice sorgente di un programma open source ed ho dovuto inserire un nuovo file. Chiaramente non essendo esperto ho iniziato con un file simile e ho modificato quello. Al momento sono riuscito a scrivere tutto ciò che dovevo ma proprio nella fase di output ho un problema. il mio codice, utilizzando dei parametri inseriti dall'utente, crea una curva sul piano x-y, con x variabile, il problema è che una volta creata la curva vorrei dividere il valore di x per un parametro sempre inserito dall'utente e non riesco a farlo, nonostante io cambi il codice nella parte di output non ho nessuna variazione. inserisco un pezzo del codice nel caso non sia chiaro oppure serva altro posterò a parte che serve


int
{
SteelSte::setTrialStrain(double trialStrain, double strainRate)
....

eps = trialStrain;

u = eps * 2 / lp;

.......

}


double
SteelSte::getStrain(void)
{

return u;
}


nonostante nella parte getStrain io gli dica di avere u ho comunque come output trialStrain che è la variabile x che utilizzo per costruire la curva. Probabilmente non ho utilizzanto la terminologia esatta ma spero sia comunque comprensibile. Grazie a chiunque risponda!

17 Risposte

  • Ma cosa è u? Dove è dichiarata?
  • U è dichiarata nel file.h

    #ifndef SteelSte_h
    #define SteelSte_h

    #include <UniaxialMaterial.h>

    class SteelSte : public UniaxialMaterial
    {
    public:
    SteelSte(int tag, double ES, double FY, double L, double DS, double TD, double U1, double KH, double lp);


    SteelSte(void);

    virtual ~SteelSte();

    const char *getClassType(void) const {return "SteelSte";};
    double getInitialTangent(void);
    UniaxialMaterial *getCopy(void);

    int setTrialStrain(double strain, double strainRate = 0.0);
    double getStrain(void);
    double getStress(void);
    double getTangent(void);

    int commitState(void);
    int revertToLastCommit(void);
    int revertToStart(void);

    int sendSelf(int commitTag, Channel &theChannel);
    int recvSelf(int commitTag, Channel &theChannel,
    FEM_ObjectBroker &theBroker);

    void Print(OPS_Stream &s, int flag =0);

    double u;
    protected:

    private:
    .......

    };
  • Addirittura come membro pubblico ... e perché mai?

    Comunque se hai problemi con il valore di u vuol dire che questo viene cambiato in altre parti del codice che non hsi mostrato.
  • In realtà anche se lo metto come privato non cambia granchè e no il valore di u l'ho creato soltanto per dividere eps ovvero trialStrain che da quello che so è la variabile x, anche se al posto di u metto:

    double
    SteelSte::getStrain(void)
    {

    return eps*2/lp;
    }

    non cambia nulla, dove eps è sempre nel file.h in

    private:

    double eps;
  • A parte il fatto che public e private è solo una questione di architettura della classe io non ho ancora capito il tuo problema.

    Hai fatto debugging per controllare i valori durante l'esecuzione? Spiegati meglio magari con dei valori che ottieni per capirti...
  • Una volta compilato il tutto ottengo il programma e utilizzando dei file tcl trovo la mia curva x-y, il mio problema è che il valore di x che trovo vorrei fosse diviso per una costante, lp, per fare ciò ho pensato che dovessi andare a modificare la parte di getStrain poichè da quello che so è proprio quello il valore di x che utilizza. Al momento quindi la mia variabile è trialStrain=eps, e questo è il valore che utilizza come x, io invece voglio dividere questo valore per lp, soltanto però nella fase di output
  • Per spiegarmi meglio spiego il problema in modo fisico e ciò che sto realizzando magari risulta più chiaro: la curva x-y è una curva spostamento-forza, dove una volta compilato il programma tramite un file tcl, viene creata una barra e viene sottoposta ad uno spostamento, ora io come risultati ho una curva che descrive sulle x gli spostamenti imposti e sulle y la forza. Vorrei però sulle x uno spostamento diviso una costante ovvero lp, quindi volevo modificare il valore di x che prende in fase di output il mio codice andando a dividere lo spostamento (x) con una costante. spero di essere stato più chiaro e intanto grazie per l'aiuto
  • A parte che moltiplichi anche per 2, non modificare la classe ma fai l'operazione quando stai per fare l'output
  • Si si so di moltiplicarlo per 2, e anche se inserisco

    double
    SteelSte::getStrain(void)
    {
    u = eps*2/lp
    return u ;
    }

    non ho nessuna variazione, è questo che intendi per fare l'operazione e non modificare la classe?
  • No

    Intendo

    return eps/2;

    e quando ti serve dividi per lp
  • Il problema è che questa curva deve essere già x*2/lp, non posso farlo manualmente dopo, poichè deve essere inserita in altri modelli ed hanno bisogno della scrittura u=x*2/lp, quindi deve essere quello il valore di output
  • Scusa ma non ho ancora capito il problema e ti assicuro che tu non aiuti a capirlo
  • Allora provo a rispiegarmi...ho scaricato il codice sorgente di un programma open source, in particolare il programma è Opensees, ho creato un file simile ad uno già presente nel codice sorgente in modo tale da avere una traccia da seguire. Il mio scopo è: creare un nuovo materiale in modo tale che un utente del programma opensees possa assegnare il mio materiale ad un elemento e applicando degli spostamenti possa leggere la curva forza spostamento dell’elemento, tutto ciò anche nel caso in cui siano presenti altri materiali oltre al mio.

    Per fare ciò devo descrivere nel codice una curva forza-deformazione..

    Nel codice sono presenti varie sezioni tra cui:

    SetTrialStrain
    Nel quale viene utilizzato un file di input .txt dove sono presenti i valori di x (spostamento) e tramite delle funzioni y=f(x) trovo la y (forza)

    Mentre poi ci sono due sezioni che da quello che ho capito sono quelle che indicano al programma i valori di output ovvero:

    GetStrain
    Dove è presente l’Output di x (spostamento)

    GetStress
    Dove è presente l’output di y (forza)

    Questo è tutto ciò che ho ottenuto al momento..
    Ora il problema che riscontro è il fatto che non voglio forza-spostamento in output bensì forza-deformazione, che in questo caso si ottiene dividendo i valori di x per “lp” e moltiplicandoli per 2.

    Quindi ho provato a modificare nella sezione Getstrain il valore di x ma non ho nessuna variazione, mentre nel caso in cui io cambi qualcosa nella sezione Getstress ho delle variazioni sulle y di output.
  • Spero di essere stato più chiaro sul problema da me riscontrato
Devi accedere o registrarti per scrivere nel forum
17 risposte