*! NJC 1.1.1 3 May 2004 
* NJC 1.1.0  29 April 2004 
* NJC 1.0.0  1 August 2001
program _ginvvm 
	version 8 
	syntax newvarname =/exp [if] [in] /// 
	[ , Kappa(numlist max=1 min=0 >=0) tol(real 1e-6) log RADians]  
	
	if "`kappa'" == "" {
		tempname kappa 
		scalar `kappa' = r(kappa) 
		if `kappa' == . { 
			di as err "kappa needed" 
			exit 198 
		} 	
	} 

	tempvar P f t v u g 
	tempname c
	marksample touse, novarlist
		
	quietly {
		gen double `P' = `exp' 
		replace `touse' = 0 if `P' > 1 | `P' < 0 
		gen double `f' = 0.5 
		gen double `t' = 0
		i0kappa `kappa' 
		scalar `c' = log(r(i0kappa))
		gen double `v' = . 
		gen double `u' = . 
		gen double `g' = . 
		local done = 0 
		while !`done' { 
			replace `g' = `f' - `P' 
			replace `u' = ///
		`t' - sign(`g') * exp(log(abs(`g')) + `c' - `kappa' * cos(`t'))
			replace `t' = `u' 
			tempvar newf 
			egen double `newf' = vm(`t'), k(`kappa') radians 
			replace `f' = `newf' 
			drop `newf' 
			replace `v' = abs(`f' - `P') 
			su `v', meanonly 
			if "`log'" != "" noi di `r(max)'
			if r(max) < `tol' local done 1
		} 

		// ignore user type
		if "`radians'" == "" { 
			gen double `varlist' = `t' * 180 / _pi if `touse' 
		} 
		else gen double `varlist' = `t' if `touse' 
	}
end