multply components ??



  • vielleicht war ich oben etwas undeutlich. also ich bastle quasi in einem bestehenden programm herum und kann dort nur bedingt sachen ändern.
    Auf jedem fall bekomm ich etwas vom datentyp List<Type> übergeben und das ist eine liste mit relativ vielen möglichkeiten.
    hier ist nun n vektor drin, soviel weiß ich. die ausgabe eines vektors ist auch kein problem:
    Pout<<sf_plus[1]<<endl;
    Das schaut in etwa so aus:
    (-0.000221935 0.000258206 0)
    Der Zugriff auf die einzelnen Komponenten ist aber nicht drin:
    Pout<<sf_plus[1][0]<<endl;
    Fehler: indizierter Wert ist weder ein Feld noch ein Zeiger

    Pout<<sf_plus[1].x<<endl; (normalerweise mit .x(), .y(), .z() zugriff)
    Fehler: Abfrage des Elementes »x« in »((Foam::GeometricField<double, Foam::fvsPatchField, Foam::surfaceMesh>*)sf_plus)->Foam::GeometricField<double, Foam::fvsPatchField, Foam::surfaceMesh>::<anonymous>.Foam::DimensionedField<double, Foam::surfaceMesh>::<anonymous>.Foam::Field<double>::<anonymous>.Foam::List<double>::<anonymous>.Foam::UList<T>::operator[] [with T = double](1)«, das vom Nicht-Klassentyp »double« ist

    Pout<<sf_plus[1].x()<<endl;
    Fehler: Abfrage des Elementes »x« in »((Foam::GeometricField<double, Foam::fvsPatchField, Foam::surfaceMesh>*)sf_plus)->Foam::GeometricField<double, Foam::fvsPatchField, Foam::surfaceMesh>::<anonymous>.Foam::DimensionedField<double, Foam::surfaceMesh>::<anonymous>.Foam::Field<double>::<anonymous>.Foam::List<double>::<anonymous>.Foam::UList<T>::operator[] [with T = double](1)«, das vom Nicht-Klassentyp »double« ist

    also funktioniert halt alles nicht.
    ich hab das ganz auch mit "multiplies" probiert:
    std::multiplies <Type> mul =std::multiplies <Type> ();
    Pout<<mul(sf_plus[1],sf_plus[1]);
    aber das brachte als fehler:
    Fehler: Umwandlung von »Foam::Tensor<double>« in nicht-skalaren Typen »Foam::Vector<double>« angefordert

    mir wurde gesagt, dass es einen befehl so ähnlich wie multiply_coponents oder irgendwie abgekürzt mtply_cmp oder so geben würde, der trotzdem die multiplikation machen würde. aber außer dem multiplies hab ich nichts gefunden und der macht das leider nicht.
    Kennt von euch jemand den befehl oder wie man den multiplies geeigneter einsetzt oder ist das problem echt nur mit grundlegenden änderungen der vector/tensor klasse möglich?



  • Deine Frage hat nichts mit Standard-C++ zu tun, oder?

    Klar ist, dass Du Zugriff auf die einzelnen Member brauchst, das sollte auch so ziemlich jede Vector-Klasse anbieten. Basierend darauf kannst Du eine freie Funktion implementieren, welche die Multiplikation für Dich erfüllt. Ob die Bibliothek sonst was mit multiply anbietet, weiß ich nicht, da würde ich einfach kurz die Doku durchsuchen und wenn sich nix findet halt selbst schreiben.



  • nunja
    der multiplies befehl/funktional ist schon standard c++.
    und der gesuchte multiplies_cmp oder ähnlich sollte auch standard sein...

    der rest war eher zur verdeutlichung, dass ich hier nicht eine neue vektorklasse machen will, sondern mit bestehenden zu kämpfen hab



  • Wie sollen wir dir denn helfen, wenn du praktisch nix von dem, was du da hast, preisgibst?



  • Also das mag jetzt nichts heißen, aber ich kennen keine Standard-C++-Funktion, die multiply heißt (oder die multiply als Teil ihres Namens hat) und bei http://www.cplusplus.com/reference/ lässt sich dazu auch nichts finden. Ich gehe Mal davon aus, dass so etwas einfach nicht zum Standard gehört.

    Also nochmal: Freie Funktion mit Zugriff auf die Elemente des Vektors und selbst schreiben, falls diese FOAM-Bibliothek nichts anbietet. Sollte doch nicht so schwierig sein. 😉



  • http://www.cplusplus.com/reference/std/functional/multiplies/
    hier ist die sache mit dem multiplies...

    zugegebenerweiße recht versteckt. google findet für den begriff auch nur 2 treffer.

    ich werd mich mal an der funktion versuchen.

    das mit dem zugriff ist aber irgendwie merkwürdig. ich schreibe was für openfoam (ist n programm zur simulation von thermodynamik zeugs). An sich versteh ich nicht ganz warum der Zugriff auf die Elemente später nicht mehr geht...
    wisst ihr was der grund ist? warum geht der zugriff nach dem ersten mal und danach nicht mehr?

    am anfang hab ich eine Liste mit vektoren und ich kann auf jede komponente zugreifen:
    Pout<<"icoFoam.C u wert: " << U.internalField()[0][0]<< endl;

    dies übergeb ich dann:
    fvm::div(phi, U)

    template<class Type> tmp<fvMatrix<Type> >
    div( const tmp<surfaceScalarField>& tflux, GeometricField<Type, fvPatchField, volMesh>& vf
    )
    vf ist hier die Liste mit den U-Vektoren...
    und kann dann ebenfalls noch drauf zugreifen:
    Pout<<"fvmDiv.C div3 u wert: " << vf.internalField()[0][0] << endl;

    aber bei der nächsten übergabe gehts nicht mehr...
    fv::convectionScheme<Type>::New (vf.mesh(), flux, vf.mesh().divScheme(name) )().fvmDiv(flux, vf);

    template<class Type>
    tmp<fvMatrix<Type> >
    gaussConvectionScheme<Type>::fvmDiv( const surfaceScalarField& faceFlux, GeometricField<Type, fvPatchField, volMesh>& vf) const

    und in fvmDiv geht nix mehr mit komponentenzugriff...
    http://www.c-plusplus.net/forum/images/smiles/confused.gif



  • Okay, nach so was habe ich nicht geschaut, weil ich aber auch keinen Sinn darin sehe. Willst Du einen Algorithmus anwenden, welcher einen Multiplizier-functor benötigt? Ich denke, Dir geht es nur um die Operation selbst, da nützt dir der functor gar nichts, wenn operator* nicht per se definiert ist. 😕

    Am Rande: Gewöhn Dir mal an, das herzallerliebste Code-Tag ([cpp][/cpp]) zu benutzen. 😉

    Dann sehe ich in deinem Code keinen Vector mehr, sprachen wir nicht über den? Und dann solltest Du vll noch "geht nicht" genauer definieren. Ich könnte jetzt raten, aber das muss ja nicht sein.

    Ansonsten hat Schaum laut Doku sehr wohl Elementzugriffe über x(), y(), z(): http://foam.sourceforge.net/doc/Doxygen/html/classFoam_1_1Vector.html

    Also seh ich nicht, wieso das hier für nen Vektor nicht klappt.

    template<typename T>
    Foam::Vector<T> multiplyComponentWise(const Foam::Vector<T>& v1, const Foam::Vector<T>& v2)
    {
        Foam::Vector<T> result(v1);
        result.x() *= v2.x();
        result.y() *= v2.y();
        result.z() *= v2.z();
        return result;
    }
    

    Aber ich glaube, ich habe dein Problem immer noch nicht so wirklich verstanden.



  • ich weiß, dass er mit .x() und so weiter auf die elemente zugreifen NORMALERWEISE.
    aber das funktioniert nicht mehr.
    Fehlermeldung ist: ... ist weder Feld noch Zeiger...

    wenn das gehen würde, wär die multiplikation ja kein problem...



  • die fehlermeldung oben war mit zugriff über inidizes.
    die hier ist mit .x()
    Fehler: Abfrage des Elementes »x« in »v2«, das vom Nicht-Klassentyp »const double« ist



  • So, der Fehler liegt ne Ebene höher, nämlich in deinen Containern oder wo auch immer du die einzelnen Vector-Elemente anordnest. Jetzt heißt es also, gut dokumentierten, kurzen, den Fehler reproduzierenden Code posten. 😉


Anmelden zum Antworten