#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# Funktion arg für Aufgabe 36 

from ngsolve import *
import numpy as np
from netgen.geom2d import SplineGeometry

# ab jetzt sind x, y, z CoefficientFunctions aus dem Modul ngsolve.fem

def arg(x, y):
    '''
    gibt den Winkel phi in [0, 2pi) aus der Darstellung x + iy = r exp(i phi) zurück, 
    phi ist wieder eine CoefficientFunction
    '''
    g1 = atan2(y,x)
    
    return IfPos(y, g1, IfPos(-y, g1 + 2*np.pi, g1))

if __name__ == "__main__":
    # Test der Funktion arg

    geo = SplineGeometry()
    geo.AddRectangle((-1.2,-1.2),(1.2,1.2),bc="rectangle")
    mesh = Mesh(geo.GenerateMesh(maxh=0.1))

    mip1 = mesh(1,0)
    cf = arg(x,y)
    for i,(xi,yi) in enumerate([(1,0), (1,1), (0,1), (-1,1), (-1,0), (-1,-1), (0,-1), (1,-1)]):
        print(f" arg({xi},{yi}) \t = {arg(xi,yi)(mip1):.6f}, \t exakter Wert = {i*np.pi/4}")

