Autor
|
Thema: Nachbildung einer gepulsten Strahlungsquelle (379 mal gelesen)
|
thephile Mitglied
Beiträge: 30 Registriert: 23.03.2010
|
erstellt am: 30. Mrz. 2010 22:19 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, ich möchte eine Bestrahlung eines Werkstoffs mit einem gepulsten Laser nachstellen. Zur Vereinfachung nehme ich an, dass der Laser kurz angeschaltet wird (z.B. für 0,0004 Sekunden), dann anschließend ausgeschaltet und um eine bestimmte Strecke weiterbewegt wird. Dann wird der Laser wieder angeschaltet und so weiter. Da der Laser einen kreisförmigen Fokusdurchmesser auf dem werkstück hinterlässt, kann man sich das Ergebnis anschaulich einer solchen Bestrahlung als einander überlappende Kreise, wie z.B. beim Audi-Emblem, vorstellen. Dabei dachte ich das ganze mittels der Subroutine DFLUX umzusetzen. Nämlich mit dem Parameter TIME(1). Dort habe ich gesagt, dass immer zu vielfachen Ganzen der Zeiteinheit der Laser angeschaltet wird. trifft das nicht zu, bleibt es eben ausgeschaltet. Sinngemäß habe ich die Rechnung ohne Rest mit der Modulo-Funktion programmiert: Code: pulsdauer=0.0004 if(mod(TIME(1),pulsdauer).eq.0)then FLUX(1)=1000 else FLUX(1)=0 endif
Das ganze funktioniert leider nicht so wie ich es gern hätte. In der Simulation fängt die Bestrahlung zwar erst nach den ersten 0,0004 Sekunden an, dann stellt aber FLUX nicht auf Null. Der Laser schaltet nicht aus, sondern erwärmt bis in alle Ewigkeit das Werkstück. Habe schon gehört, dass die Bedingung ISTGLEICH NULL zu hart ist, da die Double-Zahlen eine Nachkommastelle haben können und somit nicht exakt NULL sind. Habe deshalb versucht die Bedingung weicher zu legen, somit <1. Auch das hat nicht hingehauen. Hat jemand noch weisen Rat wie man das Problem vielleicht allgemein lösen könnte? Vielleicht mit *AMPLITUDE oder einer STEP-Definition? Die Idee ist ja: Licht an, Licht aus und das ungefähr 2500 mal pro Sekunde. Besten Dank! [Diese Nachricht wurde von thephile am 30. Mrz. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
carsten1983 Mitglied Doktorand
Beiträge: 125 Registriert: 11.10.2007
|
erstellt am: 31. Mrz. 2010 08:43 <-- editieren / zitieren --> Unities abgeben: Nur für thephile
Was meinst du mit "kleiner 1"? Ich denke es ist definitiv ungünstig eine real Zahl auf Gleichheit mit einer anderen Zahl zu prüfen. Du solltest unbedingt ein Limit festlegen, ab welchem Wert dein Ergebnis von mod gleich Null ist. Falls das die "kleiner 1" ausdrücken sollte, solltest du den Wert deutlich kleiner als 1 wählen, da der Rest der übrig bleibt ja ebenfalls in der Größenordnung der Pulsdauer liegt. z.B.:
Code: if(mod(TIME(1),pulsdauer).LT.0.00000001)then
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
thephile Mitglied
Beiträge: 30 Registriert: 23.03.2010
|
erstellt am: 31. Mrz. 2010 13:35 <-- editieren / zitieren --> Unities abgeben:
Hallo carsten, klingt einleuchtend. Habe dies probiert. Leider bleibt der Laser bei diesen Einstellungen ständig ausgeschaltet. Auch wenn ich die Bedingung sehr nah an die Null lege z.B. ....lt.1.0E-18). Gibt es eine Möglichkeit, den Wert dieser Berechnung auszugeben? Funktionieren diese Fortran-Befehle wie "write" oder "print"? Wenn ja, in welche Datei wird ausgegeben oder muss ich selber eine Datei öffnen und dies dort reinschreiben? Tausend Dank! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
carsten1983 Mitglied Doktorand
Beiträge: 125 Registriert: 11.10.2007
|
erstellt am: 31. Mrz. 2010 13:43 <-- editieren / zitieren --> Unities abgeben: Nur für thephile
rechnest du mit fixen Inkrementen? Wenn du das nicht tust, müsste nämlich schon ein großer Zufall her, damit der Laser mit deiner Bedingung überhaupt angeschaltet wird. Die Ausgabe mit write funktioniert z.B. so: Code: open(unit=11,File='C:\Umatkrams\ausg.out', &status='unknown') x=mod(TIME(1),pulsdauer) if (NOEL.EQ.1 .and.NPT.EQ.1 ) write(11,*)'Inkrement anfang',x
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
thephile Mitglied
Beiträge: 30 Registriert: 23.03.2010
|
erstellt am: 31. Mrz. 2010 14:43 <-- editieren / zitieren --> Unities abgeben:
Aha, da liegt also der Hund begraben. Flugs auf Fixed umgestellt. Das bedeutet aber auch, dass ich die Inkremente kleiner als die Zeit (0,0004s) stellten muss, um eine gescheite Auflösung zu bekommen? Hah! Es geht! An und aus und wieder an und wieder aus... Wunderbar. So wie ich es wollte. Tausend Dank! Da ich unter Linux arbeite, musste ich die Pfadangabe etwas abändern sowie die if-Bedingung, sonst hat er nichts in die Datei geschrieben. Der Teil meiner Subroutine lautet nun: Code:
open(unit=11,File='/home/zb/tester.out', & status='unknown') x=mod(TIME(1),pulsdauer) write(11,*)'Inkrement anfang',x if(mod(TIME(1),pulsdauer).lt.1.0E-7)then FLUX(1) = gaussintensitaet else FLUX(1) = 0
Was wäre eigentlich, wenn Abaqus mit dem FIXED INTERVAL nicht zurecht kommt und die Berechnung ständig abbricht? Dann wäre ich aufgeschmissen... Die Ausgabe der tester.out liefert Werte der Modulo-Funktion zwischen 1.0E-4 und 1.0E-11. Somit sollte ich mindestens lt.1.0E-12 angeben.
[Diese Nachricht wurde von thephile am 31. Mrz. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|